Elasticsearch多项过滤器

Rei*_*ghe 35 term elasticsearch

我对Elasticsearch很新,所以这是我的问题.我想用elasticsearch做一个搜索查询,想要用多个术语过滤.

如果我想搜索用户'tom',那么我希望所有匹配的用户'isActive = 1','isPrivate = 0'和'isOwner = 1'.

这是我的搜索查询

"query":{
    "filtered": {
        "query": {
            "query_string": {
                "query":"*tom*",
                "default_operator": "OR",
                "fields": ["username"]
            }
        },
        "filter": {
            "term": { 
                "isActive": "1",
                "isPrivate": "0",
                "isOwner": "1"
            }
        }
    }
}   
Run Code Online (Sandbox Code Playgroud)

当我使用2个术语时,它就像一个魅力,但当我使用3个术语时却没有.

谢谢您的帮助!!

Duc*_*ong 72

您应该使用bool filterAND所有的方面:

"query":{
    "filtered": {
        "query": {
            "query_string": {
                "query":"*tom*",
                "default_operator": "OR",
                "fields": ["username"]
            }
        },
        "filter": {
            "bool" : {
                "must" : [
                    {"term" : { "isActive" : "1" } },
                    {"term" : { "isPrivate" : "0" } },
                    {"term" : { "isOwner" : "1" } }
                ]
             }
         }
     }
}   
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么弹性版本之间会有这样的不一致。 (4认同)

Jai*_*rel 14

正如其中一条评论所说,最近的 ES 版本中的语法发生了变化。如果您使用的是Elasticsearch 6.+,并且您想在查询中使用通配符和一系列术语(例如在问题中),您可以使用以下内容:

GET your_index/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "wildcard": {
            "your_field_name_1": {
              "value": "tom*"
            }
          }
        },
        {
          "term": {
            "your_field_name_2": {
              "value": "US"
            }
          }
        },
        {
          "term": {
            "your_field_name_3": {
              "value": "Michigan"
            }
          }
        },
        {
          "term": {
            "your_field_name_4": {
              "value": "0"
            }
          }
        }
      ]
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

此外,从有关通配符查询的文档中

请注意,此查询可能很慢,因为它需要迭代许多项。为了防止极慢的通配符查询,通配符术语不应以通配符 * 或 ? 之一开头。

我希望这有帮助。

  • 如果您确实需要使用前面的通配符进行搜索,您可以使用一个技巧,并使用翻转的值 (tom -> mot) 索引一个附加字段,然后对其进行或搜索:originalfield:tom* 或 newfield:mot*。这应该会更快。 (2认同)
  • 根据 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html `must` 不能替代 `filter`:“与 `must` 不同,该查询将被忽略” (2认同)