我需要ElasticSearch完全匹配某些字段,目前使用multi_match。
例如,用户输入long beach chiropractor
。
我希望long beach
完全匹配城市字段,而不是返回seal beach
或glass beach
的结果。
同时chiropractor
也应与chiropractic
匹配。
以下是我正在使用的当前查询:
"query": {
"bool": {
"should": [
{
"multi_match": {
"fields": [
"title",
"location_address_address_1.value",
"location_address_city.value^2",
"location_address_state.value",
"specialty" // e.g. chiropractor
],
"query": "chiropractor long beach",
"boost": 6,
"type": "cross_fields"
}
}
]
}
},
答案 0 :(得分:1)
正确的方法是将搜索的术语与位置分开,并将位置存储为关键字类型。如果这不可能,那么您可以使用同义词标记生成器将位置存储为单个标记,但这需要具有所有可能位置的列表。 e.g。
{
"settings": {
"analysis": {
"filter": {
"my_synonym_filter": {
"type": "synonym",
"synonyms": [
"long beach=>long-beach"
]
}
},
"analyzer": {
"my_synonyms": {
"tokenizer": "standard",
"filter": [
"lowercase",
"my_synonym_filter"
]
}
}
}
}
}
现在,如果你打电话
POST /my_index/_analyze?analyzer=my_synonyms
{
"text": ["chiropractor long beach"]
}
回应是
{
"tokens": [
{
"token": "chiropractor",
"start_offset": 0,
"end_offset": 12,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "long-beach",
"start_offset": 13,
"end_offset": 23,
"type": "SYNONYM",
"position": 1
}
]
}