web-dev-qa-db-ja.com

ElasticSearch:オブジェクトの配列内を検索

配列内のオブジェクトのクエリに問題があります。非常に単純なインデックスを作成して、1つのフィールドを持つ型を追加し、オブジェクトの配列を持つ1つのドキュメントを追加します(私はセンスコンソールを使用しています)。

PUT /test/
PUT /test/test/_mapping
{
    "test": {
        "properties": {
            "parent": {"type": "object"}
        }
    }
}
Post /test/test
 {
     "parent": [
                  {
                     "name": "turkey",
                     "label": "Turkey"
                  },
                  {
                     "name": "turkey,mugla-province",
                     "label": "Mugla (province)"
                  }
               ]
 }   

両方の名前で検索したい"turkey"および"turkey,mugla-province"。最初のクエリは正常に機能します。

GET /test/test/_search {"query":{ "term": {"parent.name": "turkey"}}}

しかし、2番目のものは何も返しません。

GET /test/test/_search {"query":{ "term": {"parent.name": "turkey,mugla-province"}}}

私は以下を含む多くのものを試しました:

 "parent": {
              "type": "nested",
              "include_in_parent": true,
              "properties": {
                 "label": {
                    "type": "string",
                    "index": "not_analyzed"
                 },
                 "name": {
                    "type": "string",
                    "store": true
                 }
              }
           }

しかし、何も助けにはなりません。私は何を見逃していますか?

12
Nikita

nested docsを使用してこれを行う方法の1つを次に示します。

私はこのようなインデックスを定義しました:

PUT /test_index
{
   "mappings": {
      "doc": {
         "properties": {
            "parent": {
               "type": "nested",
               "properties": {
                  "label": {
                     "type": "string"
                  },
                  "name": {
                     "type": "string"
                  }
               }
            }
         }
      }
   }
}

ドキュメントにインデックスを付けました:

PUT /test_index/doc/1
{
   "parent": [
      {
         "name": "turkey",
         "label": "Turkey"
      },
      {
         "name": "turkey,mugla-province",
         "label": "Mugla (province)"
      }
   ]
}

次に、これらのクエリのいずれかがそれを返します。

POST /test_index/_search
{
    "query": {
        "nested": {
           "path": "parent",
           "query": {
               "match": {
                  "parent.name": "turkey"
               }
           }
        }
    }
}

POST /test_index/_search
{
    "query": {
        "nested": {
           "path": "parent",
           "query": {
               "match": {
                  "parent.name": "turkey,mugla-province"
               }
           }
        }
    }
}

これが私が使ったコードです:

http://sense.qbox.io/Gist/6258f8c9ee64878a1835b3e9ea2b54e5cf6b1d9e

10
Sloan Ahrens

複数の用語を検索するには、用語クエリの代わりに用語クエリを使用します。

"terms" : {
        "tags" : [ "turkey", "mugla-province" ],
        "minimum_should_match" : 1
    }

このクエリを作成するにはさまざまな方法がありますが、これは現在のバージョンのElasticSearch(1.6)で最もシンプルで最もエレガントです。