我有一个字段,我想过滤多个值。我目前使用terms
过滤器执行此操作:
"filter" : {
"terms" : { "user" : ["kimchy", "elasticsearch"]}
}
但是我希望过滤器匹配前缀和整个术语,像这样(prefixes
只是我假想我想要的):
"filter" : {
"prefixes" : { "user" : ["kim", "elast"]}
}
或者我是否必须使用多个or
过滤器?
"filter" : {
"or" : {
"filters" : [
{
"prefix" : { "user" : "kim" }
},
{
"prefix" : { "user" : "elast" }
}
],
答案 0 :(得分:2)
ES
没有prefixes
但
1)您可以使用query string query而不是撰写多个or filters
您可以将查询编写为
{
"query": {
"query_string": {
"default_field": "users",
"query": "kim* OR elas*"
}
}
}
但是有一个问题,如果您的user
字段被映射为not_analyzed
,那么它将无法找到 Kimchy ,默认情况下 Elasticsearch { {1}}为真,它会小写所有前缀。
为了使其100%正常工作,我建议您使用keyword tokenizer lowercase token filter,以便我们可以进行不区分大小写的搜索,之后上述查询将为您提供所需的结果。您可以使用lowercase_expanded_terms
2)另一种方法可能是OR
与keyword tokenizer
和edgengram token filter
混合。假设您使用lowercase
和min_gram : 2
,那么您可以使用max_gram : 7
查询本身就像多个前缀查询一样
terms
希望这有帮助!