web-dev-qa-db-ja.com

複数のタイプにElasticSearchクエリパラメータ(DSLクエリ)を使用するにはどうすればよいですか?

私はここ数か月からElasticSearchを使用していますが、複雑なクエリを渡す必要がある場合は、それでも複雑になります。

複数の「タイプ」を検索する必要があり、各タイプを独自の「フィルター」で検索する必要があるクエリを実行したいのですが、「検索結果」を組み合わせる必要があります

例えば:

友達の「ユーザータイプ」のドキュメントを検索すると同時に、指定されたキーワードに従って、好きな「オブジェクトタイプ」のドキュメントを検索する必要があります。

OR

「AND」句と「NOT」句の両方を持つクエリ

クエリの例:

$options['query'] = array(
        'query' => array(
            'filtered' => array(
                'query' => array(
                    'query_string' => array(
                        'default_field' => 'name',
                        'query' => $this->search_term . '*',
                    ),
                ),
                'filter' => array(
                    'and' => array(
                        array(
                            'term' => array(
                                'access_id' => 2,
                            ),
                        ),
                    ),

                    'not' => array(
                        array(
                            'term' => array(
                                'follower' => 32,
                            ),
                        ),

                        array(
                            'term' => array(
                                'fan' => 36,
                            ),
                        ),
                    ),
                ),
            ),
        ),
    );

このクエリはaccess_id = 2のユーザーを検索することを目的としているため、ID32のフォロワーとID36のファンがあってはなりません。

しかし、これは機能していません。

編集:変更されたクエリ

{
  "query": {
    "filtered": {
      "filter": {
        "and": [
          {
            "not": {
              "filter": {
                "and": [
                  {
                    "query": {
                      "query_string": {
                        "default_field": "fan",
                        "query": "*510*"
                      }
                    }
                  },
                  {
                    "query": {
                      "query_string": {
                        "default_field": "follower",
                        "query": "*510*"
                      }
                    }
                  }
                ]
              }
            }
          },
          {
            "term": {
              "access_id": 2
            }
          }
        ]
      },
      "query": {
        "field": {
          "name": "xyz*"
        }
      }
    }
  }
}

このクエリを実行した後、2つの結果が得られました。1つはフォロワー: "34,518"とファン: "510"で、もう1つはファン: "34"ですが、そうではありません。結果の2番目だけになります。

何か案は?

15
Chetan Sharma

今月私が行ったプレゼンテーションのスライドをご覧になるとよいでしょう。これは、クエリDSLがどのように機能するかの基本を説明しています。

愛情の条件-ElasticSearchクエリDSLの説明

クエリの問題は、フィルタが正しくネストされていないことです。 andフィルターとnotフィルターは同じレベルですが、notフィルターはandの下にある必要があります。

curl -XGET 'http://127.0.0.1:9200/_all/_search?pretty=1'  -d '
{
   "query" : {
      "filtered" : {
         "filter" : {
            "and" : [
               {
                  "not" : {
                     "filter" : {
                        "and" : [
                           {
                              "term" : {
                                 "fan" : 36
                              }
                           },
                           {
                              "term" : {
                                 "follower" : 32
                              }
                           }
                        ]
                     }
                  }
               },
               {
                  "term" : {
                     "access_id" : 2
                  }
               }
            ]
         },
         "query" : {
            "field" : {
               "name" : "keywords to search"
            }
         }
      }
   }
}
'
14
DrTech

「BOOL」で試してみました

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "access_id": 2
          }
        },
        {
          "wildcard": {
            "name": "xyz*"
          }
        }
      ],
      "must_not": [
        {
          "wildcard": {
            "follower": "*510*"
          }
        },
        {
          "wildcard": {
            "fan": "*510*"
          }
        }
      ]
    }
  }
}

正解です。

しかし、私はそれがこのように使用されるべきかどうかわかりませんか?

3
Chetan Sharma