2016-02-03 100 views
1

雖然有記錄,但沒有工作示例說明如何使用索引時間和不同的查詢時間分析器創建索引。使用不同的查詢和索引時間分析器創建elasticsearch索引

我希望在搜索上應用同義詞過濾器。如果我指定分析儀名稱,但可以測試分析儀,但沒有名稱,它不會檢測到默認值。

什麼可能是錯的?

"settings": { 
     "index": {   
     "analysis": { 
      "filter": { 
      "synonym": { 
       "type": "synonym", 
       "synonyms": [ 
       "testword => otherword" 
       ] 
      } 
      }, 
      "analyzer": { 
      "default_search": { 
       "filter": [ 
       "lowercase", 
       "asciifolding", 
       "synonym" 
       ], 
       "tokenizer": "standard" 
      }, 
      "default_index": { 
       "filter": [ 
       "lowercase", 
       "asciifolding" 
       ], 
       "tokenizer": "standard" 
      } 
      } 
     } 

注意兩個不同的分析儀,名爲default_searchdefault_index。根據文檔,這些應該被視爲默認值。所以如果我執行'testword'的搜索,它會搜索'otherword'。

我可以確認默認分析器的名稱被設置在索引類型:

"myIndex": { 
    "mappings": { 
     "myType": { 
     "index_analyzer": "default_index", 
     "search_analyzer": "default_search", 
     "properties": ... 

我執行測試搜索:

而不指定分析器/myIndex/_analyze/?pretty=true&text=testword呼叫(它期待拾取default_search作爲配置)

{ 
    "tokens" : [ { 
    "token" : "testword", 
    "start_offset" : 0, 
    "end_offset" : 9, 
    "type" : "<ALPHANUM>", 
    "position" : 1 
    } ] 
} 

使用特定分析器撥打myIndex/_analyze/?analyzer=default_search&pretty=true&text=testword

{ 
    "tokens" : [ { 
    "token" : "otherword", 
    "start_offset" : 0, 
    "end_offset" : 9, 
    "type" : "SYNONYM", 
    "position" : 1 
    } ] 
} 

一個示例搜索,該索引包含一個字段值爲'otherword'的項目。下面的查詢不會返回任何結果,搜索'otherword'會返回所需的項目。 POST myIndex/_search

"query": { 
    "multi_match": { 
    "query": "testword", 
    "analyzer": "default_search", 
    "fields": [ 
     "name"  
    ] 
    } 
} 
+0

請注意,用於索引的默認分析器應該被命名爲'default',而不是'default_index'(參見[here])。(https://www.elastic.co/guide/en/elasticsearch/reference/2.2 /analysis-analyzers.html#default-analyzers)。你也可以解釋你如何運行你的測試搜索? – Val

+0

@Val查看已更新的問題,顯示查詢 – simbolo

+0

您正在使用哪個版本的ES? – ChintanShah25

回答

1

既然你調用_analyze終點,這不是一個搜索。你居然讓到ES請求並要求它分析你給它彷彿ES被索引這些令牌,令牌流,所以默認索引分析踢英寸

如果你想嘗試default_search分析儀,您需要向_search端點發送請求。

你需要指數隨otherword一個文件,然後搜索使用/_search?q=testword,你會看到在default_search分析踢。

UPDATE

你沒有正確定義默認的分析,即您需要在settings(不在mappings)中執行此操作並正確命名(即default而不是default_index)。

這裏是我用於測試的索引:

curl -XPUT localhost:9200/myindex -d '{ 
    "settings": { 
    "index": { 
     "analysis": { 
     "filter": { 
      "synonym": { 
      "type": "synonym", 
      "synonyms": [ 
       "testword => otherword" 
      ] 
      } 
     }, 
     "analyzer": { 
      "default_search": { 
      "filter": [ 
       "lowercase", 
       "asciifolding", 
       "synonym" 
      ], 
      "tokenizer": "standard" 
      }, 
      "default": { 
      "filter": [ 
       "lowercase", 
       "asciifolding" 
      ], 
      "tokenizer": "standard" 
      } 
     } 
     } 
    } 
    }, 
    "mappings": { 
    "myType": { 
     "properties": { 
     "name": { 
      "type": "string" 
     } 
     } 
    } 
    } 
}' 

下面是一個示例文檔我已索引來進行測試:使用下面的查詢不指定任何分析儀

curl -XPUT localhost:9200/myindex/myType/1 -d '{ 
    "name": "otherword" 
}' 

然後,我可以找到上述文件:

curl -XPOST localhost:9200/myindex/myType/_search -d '{ 
    "query": { 
    "multi_match": { 
     "query": "testword", 
     "fields": [ 
     "name" 
     ] 
    } 
    } 
}' 

迴應:

{ 
... 
    "hits" : { 
    "total" : 1, 
    "max_score" : 0.30685282, 
    "hits" : [ { 
     "_index" : "myindex", 
     "_type" : "myType", 
     "_id" : "1", 
     "_score" : 0.30685282, 
     "_source":{"name":"otherword"} 
    } ] 
    } 
} 
+0

感謝您輸入@Val。我沒有使用索引默認值而不是搜索來預取'_analyze'端點。不幸的是,即使在查詢中,即使我指定它,搜索默認也不會啓動。我想我必須將同義詞邏輯移動到應用程序,並在查詢之前處理這些單詞,因爲Elastic似乎在收集它們時遇到了問題。我已更新問題以顯示示例查詢。 – simbolo

+0

我已經更新了我的答案。 – Val

+0

感謝您的幫助@Val。我從頭開始嘗試,它的工作原理。在粘貼示例代碼時,爲了清晰起見,我將實際值更改爲示例值。我沒有提到的是,我的'別語'實際上是'N°5'。我相信這個值正在被asciifolding過濾器刪除。因此,即使同義詞正在工作,新值已經從索引中刪除,因此不會匹配結果。我試圖使用一個停止詞。再次感謝。 – simbolo

相關問題