web-dev-qa-db-ja.com

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

2つの用語を使用する場合、それは魅力のように機能しますが、3つの用語を使用する場合は機能しません。

助けてくれてありがとう!!

31

bool filterを使用して、すべての用語をANDに使用する必要があります。

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

コメントの1つにあるように、最近の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"
            }
          }
        }
      ]
    }
  }
}

また、ワイルドカードクエリに関する documentation から:

このクエリは多くの用語を反復処理する必要があるため、時間がかかることに注意してください。ワイルドカードクエリが非常に遅くなるのを防ぐために、ワイルドカード用語はワイルドカード*または?のいずれかで始まってはなりません。

これがお役に立てば幸いです。

0
Jaime Caffarel