2015-05-26 135 views
0

我試圖用Elasticsearch返回那些在兩個領域的不同方面的文檔。不知道如何寫這將是這樣的:Elasticsearch兩套條款對兩個領域

query: 
    field1: "term set #1" 
    field2: "very different term set #2" 

理想情況下,術語集是字符串數組。我希望所有術語和字段匹配都是ORed,所以最好的文檔會在每個字段都有所有匹配,但是如果任何字段沒有匹配,那就沒問題。

回答

1

您可以使用Terms Querybool should實現這一假設你想不加分析匹配的精確值。 Terms Query的美妙之處在於它暗含了一系列值,它隱含地是一個OR操作。

{ 
    "query": { 
     "bool": { 
     "should": [ 
      { 
       "terms": { 
        "field1": [ 
        "field1 value1", 
        "field1 value2", 
        "field1 value3" 
        ] 
       } 
      }, 
      { 
       "terms": { 
        "field2": [ 
        "field2 value1", 
        "field2 value2", 
        "field2 value3" 
        ] 
       } 
      } 
     ] 
     } 
    } 
} 
+0

這看起來像答案。我不想要分析器。這些術語不是來自文本,也不應該在查詢或ES存儲中進行標記。爲了確保分析器不用於查詢或查看術語,所以我需要做其他任何事情,也許在索引配置? – pferrel

+0

一個相關的問題是如何將文檔術語插入爲數組而不是字符串。 – pferrel

1

您可以嘗試類似下面的查詢開始。這是一個非常簡單的查詢,將找到的文檔,其field1比賽term set one OR field2比賽very different term set two。因爲ES會在分析階段期間爲您提供,所以您不需要指定術語數組,因爲ES將在分析階段爲您完成,即將花費term set one並將其拆分爲令牌termsetone,並將它們與field1匹配。同樣,對於field2

另請注意我已指定or運營商,即使它是默認僅用於說明還有and,您是否需要它在某個時間點。

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "field1": "term set one", 
      "operator": "or" 
      } 
     }, 
     { 
      "match": { 
      "field2": "very different term set two", 
      "operator": "or" 
      } 
     } 
     ], 
     "minimum_should_match": 1 
    } 
    } 
} 

試試看,讓我們知道它是怎麼回事。

+0

這看起來八九不離十。他們不是文字術語,所以我不希望他們通過分析儀。我需要像Solr多值字段 – pferrel