2017-07-16 83 views
0

我在我的elasticsearch索引中有一個"name" field - not_analyzedElasticsearch - 與部分搜索詞匹配not_analyzed字段

可以說價值"name" field"some name"。我的問題是,如果我想匹配搜索詞 - some name some_more_name someother name,因爲它包含some name,那麼not_analyzed會允許匹配發生,如果不匹配,那麼我如何才能匹配搜索詞?

回答

1

索引期間name字段的文本存儲在倒排索引中。如果分析此字段,則將使用2個術語進入倒排索引:somename。但由於未分析,因此只存儲一項:some name 在搜索過程中(使用匹配查詢),默認情況下會分析並標記化搜索查詢。所以會有幾個術語:some,name,some_more_namesomeother。然後Elasticsearch將查看倒排索引以查看搜索查詢中是否至少有一個詞條。但是隻有some name術語,所以您不會在結果集中看到此文檔。
您可以用分析儀端點

回到你的問題,如果你想獲得建議的搜索查詢的比洞賽,你的領域必須進行分析。

如果您需要保留非分析版本,以及你應該使用multi fields

PUT my_index 
{ 
    "mappings": { 
    "my_type": { 
     "properties": { 
     "name": { 
      "type": "keyword", 
      "fields": { 
      "analyzed": { 
       "type": "text" 
      } 
      } 
     } 
     } 
    } 
    } 
} 
0

塔拉斯已經解釋清楚了,我問題可能已經解決,但還是如果你不能改變你的索引的映射,您可以使用查詢(我已經在5.4 ES測試)

GET test/_search 
{ 
    "query": { 
    "query_string": { 
     "default_field": "namekey", 
     "query": "*some* *name*", 
     "default_operator": "OR" 
    } 
    } 
+0

使用通配符總是會影響性能,特別是如果'一些name'實際上是'some1 some2 some3 some4名1名2 NAME3 name4',相關 - https://開頭討論.elastic.co /噸/精確匹配-IN-A-未分析場/ 37121 – vjjj