我正在使用我的自定义分析器autocomplete_analyzer
和过滤器edgeNGram
。所以映射看起来像:
"acts_as_taggable_on_tags" : {
"acts_as_taggable_on/tag" : {
"properties" : {
"name" : {
"type" : "string",
"boost" : 10.0,
"analyzer" : "autocomplete_analyzer"
}
}
}
}
当我使用query_string
进行搜索时,它就像自动完成一样。例如,查询“lon”返回[“lon”,“long”,“london”,...]。
但有时我需要完全匹配。我怎样才能得到一个完全匹配的单词“lon”?我可以在进行搜索查询时使用其他分析工具(例如simple
或standard
)吗?
答案 0 :(得分:2)
我认为您需要将数据存储在2个单独的字段中。一个包含执行自动完成查询所需的标记,另一个包含完整搜索查询。
如果您只有一个带有令牌[lon, lond, londo, london]
的字段,那么如果您搜索此字段,则无法说“请仅匹配令牌london
,因为这是完整的字/最长令牌”。
使用多字段可以很好地为您完成2个字段。看看the elasticsearch docs on multi-field。这部分的“官方”文档相当不错,请查看!
我可能会这样做:
"acts_as_taggable_on_tags" : {
"acts_as_taggable_on/tag" : {
"properties" : {
"name" : {
"type" : "multi_field",
"fields" : {
"name" : {
"type" : "string",
"boost" : 10.0
},
"autocomplete" : {
"type" : "string",
"analyzer" : "autocomplete_analyzer",
"boost" : 10.0
}
}
}
}
}
}
用于自动填充查询:
"query": {
"query_string": {
"query" : "lon",
"default_field": "name.autocomplete"
}
}
正常查询:
"query": {
"query_string": {
"query" : "lon",
"default_field": "name"
}
}
注意“default_field”的区别。
给出的另一个答案是行不通的;不同的search_analyzer
意味着搜索“伦敦”不会被标记为lon, lond, londo, london
。 但是这不会阻止搜索'lon'来匹配名称为'london'的文档,我认为这就是你想要的。