2017-08-17 127 views
0

我需要ElasticSearch完全匹配某些字段,目前使用multi_match。例如,用戶鍵入long beach chiropractorElasticsearch完全匹配某些字段,但不是其他字段

我想要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

正確的做法是單獨被搜索和定位來看,和存儲位置爲關鍵字類型。如果這不可行,那麼您可以使用同義詞標記器將位置存儲爲單個標記,但這需要具有所有可能位置的列表。例如

{ 
    "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 
     } 
    ] 
} 
相關問題