2013-12-08 108 views
3

我正在使用ElasticSearch来让用户搜索包含连接的标记字符串的文本字段。查询看起来是这样的,它很好地工作:ElasticSearch上的查询字符串的模糊查找

{ 
    'query' : { 
     'query_string' : { 
      'query' : 'user query with +bool AND operators', 
      'default_operator' : 'AND', 
      'fields' : ['tag_string'], 
      'analyzer' : 'my_analyzer' 
     } 
    } 
} 

不过,我想启用模糊匹配,使英,美拼写都包括在内。例如。我想要获得“灰色”和“灰色”或“颜色”和“颜色”的相同结果。

这可以由用户通过使用模糊运算符“〜”来完成 - 因此搜索“颜色〜”匹配“颜色”和“颜色”。但是,这应该自动完成......但是,搜索查询可能包含bool运算符,因此可能很复杂。

回答

2

您可以使用模糊查询:

{ 
    "fuzzy" : { "user" : "ki" } 
} 

或者在match查询中使用fuzziness因素。在你的例子中实现你想要的另一种方法是使用同义词。使用同义词,您可以告诉elasticsearch将原始单词的同义词与原始单词一起存储,例如灰色将被存储为灰色和灰色。

这里是同义词的深入描述:http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html

+0

谢谢!你能否更详细地解释模糊因素如何工作?这些沉重的要求或表现是否与他们相符?同义词可能很乏味,因为我们正在使用20种语言:-P –

1

(如果你要使用它)fuzzy搜索的另一个例子

POST /IndexName/TypeName/_search?size=200 
{ 
    "query": { 
     "fuzzy": { 
     "FieldName": { 
      "value": "gray", 
      "fuzziness": 2, 
      "prefix_length": 1, 
      "boost": 5 
     } 
     } 
    } 
} 

多词搜索中使用fuzzy_like_this

POST /IndexName/TypeName/_search?size=200 
{ 
    "query": { 
     "fuzzy_like_this": { 
     "fields": ["FieldName1","FieldName2"], 
     "like_text": "user query with +bool AND operators", 
     "max_query_terms": 12, 
     "fuzziness": 0.5 
     } 
    } 
}