Elasticsearch完全匹配某些字段但不匹配其他字段

时间:2017-08-17 17:13:20

标签: elasticsearch

我需要ElasticSearch完全匹配某些字段,目前使用multi_match。

例如,用户输入long beach chiropractor

我希望long beach完全匹配城市字段,而不是返回seal beachglass 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"
                }
            }
        ]
    }
},

1 个答案:

答案 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
        }
    ]
}