2013-04-03 37 views
1

我對ElasticSearch查詢有疑問。我有一個叫做「名字」的字段,用語音插件中的分析器定義。Elasticsearch:查詢避免定義的分析器/使用另一個分析器

"name" : { 
     "type" : "string", 
     "store" : "yes", 
     "index" : "analyzed", 
     "analyzer" : "soundsAnalyzer", 
     "boost" : 10.0 
    }, 

到目前爲止一切正常!然而,我在這個領域有一個特定的查詢,我想獲得精確匹配而不是類似的響應匹配。我試圖通過使用術語查詢以及文本查詢來實現此目的。術語查詢不會返回任何結果,我沒有膠水爲什麼。通過使用文本查詢並定義另一個分析器,我也沒有任何東西。我已經試過以下查詢:

{ 
    "query": { 
    "text": { 
     "documents.name": { 
     "query": "England", 
     "analyzer": "plainAnalyzer" 
     } 
    } 
    } 
} 

所以我的問題,我怎麼能做到避免定義分析器在映射只是這個特定的查詢來獲取精確匹配? TIA

回答

1

您將不得不爲這個字段索引兩次 - 一次使用soundsAnalyzer,另一次使用plainAnalyzer。你可以做到這一點使用multi_field類型:

"name" : { 
    "type" : "multi_field", 
    "fields" : { 
     "name" : {"type" : "string", "store" : "yes", "index" : "analyzed", "analyzer" : "soundsAnalyzer", "boost" : 10.0}, 
     "plain" : {"type" : "string", "index" : "analyzed", "analyzer" : "plainAnalyzer"} 
    } 
} 

正在使用soundsAnalyzer目前所有的疑問都將保持不變。在需要plainAnalyzer查詢可以使用name.plain代替name

{ 
    "query": { 
    "text": { 
     "documents.name.plain": { 
     "query": "England" 
     } 
    } 
    } 
} 
+0

謝謝您的快速答覆非常@imotov。所以我理解你是正確的,我必須通過使用這種方法來存儲我的數據兩次(...)嗯,它實際上是大量的數據:) – Neil

+1

不,數據將仍然存儲一次,但它將被索引在兩種不同的方式。 – imotov

+0

它只是像一個迷人的作品,但當涉及到附件時,我有點掙扎。它應該是類似的還是我必須複製整個附件聲明? (它是我目前的解決方法)只是將字段更改爲存儲二進制數據的multi_field不起作用。這意味着,二進制數據將寫入兩個字段,但查詢僅適用於具有與附件相同名稱的查詢。再次感謝。 – Neil