Elasticsearch multi term filter

前端 未结 2 1763
伪装坚强ぢ
伪装坚强ぢ 2021-01-30 08:57

I\'m quite new to Elasticsearch, so here\'s my question. I wanna do a search query with elasticsearch and wanna filter with multiple terms.

If I want to search for a use

相关标签:
2条回答
  • 2021-01-30 09:08

    As one of the comments says, the syntax has changed in recent ES versions. If you are using Elasticsearch 6.+, and you want to use a wildcard and a sequence of terms in your query (such as in the question), you can use something like this:

    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"
                }
              }
            }
          ]
        }
      }
    }
    

    Also, from the documentation about wildcard queries:

    Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?.

    I hope this helps.

    0 讨论(0)
  • 2021-01-30 09:12

    You should use bool filter to AND all your terms:

    "query":{
        "filtered": {
            "query": {
                "query_string": {
                    "query":"*tom*",
                    "default_operator": "OR",
                    "fields": ["username"]
                }
            },
            "filter": {
                "bool" : {
                    "must" : [
                        {"term" : { "isActive" : "1" } },
                        {"term" : { "isPrivate" : "0" } },
                        {"term" : { "isOwner" : "1" } }
                    ]
                 }
             }
         }
    }   
    

    For version 2.x+ you can use bool query instead of filtered query with some simple replacement: https://www.elastic.co/guide/en/elasticsearch/reference/7.4/query-dsl-filtered-query.html

    0 讨论(0)
提交回复
热议问题