2014-10-01 178 views
2

我有一個值列表,我希望在product_code字段中包含這些值中的任意值的所有文檔。匹配具有多個值的查詢

我想這一點,但即使它不給一個錯誤,它只是給我的文件之一:

"query": { 
    "match": { 
    "product_code": { 
     "query": ["ABC 4", "ABC 5"] 
    } 
    } 
} 

所以基本上,我在尋找terms過濾器的功能,但與分析。

我當然可以這樣做:

"bool": { 
    "should": [ 
    { 
     "query": { 
     "match": { 
      "product_code": "ABC 4" 
     } 
     } 
    }, 
    { 
     "query": { 
     "match": { 
      "product_code": "ABC 5" 
     } 
     } 
    } 
    ] 
} 

不過這樣會相當冗長的長列表。

product_code這樣定義:

"product_code": { 
    "type": "string", 
    "analyzer": "product_code", 
} 

PRODUCT_CODE分析:

"product_code": { 
    "type": "custom", 
    "filter": [ 
    "lowercase", 
    "trim" 
    ], 
    "tokenizer": "keyword" 
} 

回答

1

對於match AFAIK,沒有等同的terms查詢。另一種選擇是query_string這是更簡潔:

{ 
    "query": { 
    "query_string": { 
     "default_field": "product_code", 
     "query": "\"ABC 4\" OR \"ABC 5\"" 
    } 
    } 
} 

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html

+0

這看起來不錯...除了其他引號之外,還有什麼特殊字符可以在引號內跳過嗎?或者只是把沒有引號,但逃脫一切特別包括空間? – AndreKR 2014-10-01 09:17:58

+0

您需要轉義Lucene在此列出的特殊字符:http://lucene.apache.org/core/2_9_4/queryparsersyntax.html#Escaping特殊字符 – 2014-10-01 10:25:37

0

我可能失去了一些東西,但如何:

{ 
    "constant_score" : { 
     "filter" : { 
      "terms" : { "product_code" : ["ABC 4", "ABC 5"]} 
     } 
    } 
} 

莫非這是你在找什麼?

+0

是否分析的條款? – AndreKR 2014-10-01 08:03:13

+0

「terms」查詢不分析術語。 – 2014-10-01 08:05:32