2016-11-10 65 views
0

如何执行模糊查询并包含字符串? 比方说,我有以下文件:Fuzzy contains query with elasticSearch

{ ... "name":"william shakespeare" ... }

我希望得到以下查询文档:

  1. “威廉”(将返回所有威廉姆斯)
  2. “ Willeam“(与1相同)
  3. ”William Shake“(将仅返回包含”William Shake“的文档
  4. ”Wiliam sa柯”(如3相同)
  5. ‘威廉·莎士比亚’/‘威廉·莎士比亚’/‘威廉shakespeer’(将仅返回莎士比亚

我试图用NGRAM分析和模糊查询,但没有成功。

{ 
    "settings": { 
    "analysis": { 
     "filter": { 
     "ngram_analyzer_filter": { 
      "type": "ngram", 
      "min_gram": 2, 
      "max_gram": 15 
     } 
     }, 
     "analyzer": { 
     "ngram_analyzer": { 
      "type": "custom", 
      "tokenizer": "standard", 
      "filter": [ 
      "lowercase", 
      "ngram_analyzer_filter" 
      ] 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "my_type": { 
     "properties": { 
     "name": { 
      "type": "string", 
      "analyzer": "ngram_analyzer", 
      "search_analyzer": "standard", 
      "fields": { 
      "raw": { 
       "type": "string", 
       "index": "not_analyzed" 
      } 
      } 
     } 
     } 
    } 
    } 
} 

我的查询:

{ 
    "query": { 
    "multi_match": { 
     "query": "william shake", 
     "fields": [ 
     "name.raw" 
     ], 
     "fuzziness": 2, 
     "minimum_should_match":2 
    } 
    } 
} 
  • 它multi_match因为我搜索多个领域。
  • 试图使用分析字段或not_analyzed字段。
  • 试图用 “类型”: “短语”
  • 弹性版本2.3.1

回答

0

可以尝试下面的查询。

{ 
    'query': { 
    'multi_match': { 
     'fields': [ 
      "name.raw" 
     ], 
     'query': $scope.search.queryTerm, 
     'fuzziness': 2, 
     'prefix_length': 1 
    } 
    } 
}