2014-10-01 124 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