配列内のオブジェクトのクエリに問題があります。非常に単純なインデックスを作成して、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
}
}
}
しかし、何も助けにはなりません。私は何を見逃していますか?
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
複数の用語を検索するには、用語クエリの代わりに用語クエリを使用します。
"terms" : {
"tags" : [ "turkey", "mugla-province" ],
"minimum_should_match" : 1
}
このクエリを作成するにはさまざまな方法がありますが、これは現在のバージョンのElasticSearch(1.6)で最もシンプルで最もエレガントです。