9

私はElasticSearchと非SQLパラダイムに不慣れです。私はESチュートリアルに従っていますが、機能させることができなかったことが1つあります。

次のコード(私はPyESを使用てESと対話しています)では、ネストされたフィールド(subjects)を使用して、別のネストされたフィールド(concepts)を含む単一のドキュメントを作成します。

from pyes import *

conn = ES('127.0.0.1:9200')  # Use HTTP

# Delete and Create a new index.
conn.indices.delete_index("documents-index")
conn.create_index("documents-index")

# Create a single document.
document = {
    "docid": 123456789,
    "title": "This is the doc title.",
    "description": "This is the doc description.",
    "datepublished": 2005,
    "author": ["Joe", "John", "Charles"],
    "subjects": [{
                    "subjectname": 'subject1',
                    "subjectid": [210, 311, 1012, 784, 568],
                    "subjectkey": 2,
                    "concepts": [
                                    {"name": "concept1", "score": 75},
                                    {"name": "concept2", "score": 55}
                                  ]
                },
                {
                    "subjectname": 'subject2',
                    "subjectid": [111, 300, 141, 457, 748],
                    "subjectkey": 0,
                    "concepts": [
                                    {"name": "concept3", "score": 88},
                                    {"name": "concept4", "score": 55},
                                    {"name": "concept5", "score": 66}
                                  ]
                }],
    }


# Define the nested elements.
mapping1 = {
            'subjects': {
                'type': 'nested'
            }
        }
mapping2 = {
            'concepts': {
                'type': 'nested'
            }
        }
conn.put_mapping("document", {'properties': mapping1}, ["documents-index"])
conn.put_mapping("subjects", {'properties': mapping2}, ["documents-index"])


# Insert document in 'documents-index' index.
conn.index(document, "documents-index", "document", 1)

# Refresh connection to make queries.
conn.refresh()

サブジェクトのネストされたフィールドをクエリできます。

query1 = {
    "nested": {
        "path": "subjects",
        "score_mode": "avg",
        "query": {
            "bool": {
                "must": [
                    {
                        "text": {"subjects.subjectname": "subject1"}
                    },
                    {
                        "range": {"subjects.subjectkey": {"gt": 1}}
                    }
                ]
            }
        }
    }
}


results = conn.search(query=query1)
for r in results:
    print r  # as expected, it returns the entire document.

しかし、ネストされたフィールドの概念に基づいてクエリを実行する方法がわかりません。

ESのドキュメントはそれを参照しています

マルチレベルのネストは自動的にサポートおよび検出されるため、内部のネストされたクエリは、別のネストされたクエリ内に存在する場合、関連するネストレベル(ルートではない)と自動的に一致します。

そこで、次の形式でクエリを作成しようとしました。

query2 = {
        "nested": {
            "path": "concepts",
            "score_mode": "avg",
            "query": {
                "bool": {
                    "must": [
                        {
                            "text": {"concepts.name": "concept1"}
                        },
                        {
                           "range": {"concepts.score": {"gt": 0}}
                        }
                    ]
                }
            }
        }
}

0の結果を返しました。

何が欠けているのか理解できず、2つのレベルのネストに基づくクエリの例は見つかりませんでした。

4

3 に答える 3

15

わかりました、組み合わせのトーンを試した後、最終的に次のクエリを使用してそれを取得しました:

query3 = {
    "nested": {
        "path": "subjects",
        "score_mode": "avg",
        "query": {
            "bool": {
                "must": [
                    {
                        "text": {"subjects.concepts.name": "concept1"}
                    }
                ]
            }
        }
    }
}

したがって、ネストされたパス属性( subject )は、ネストされた属性レベルに関係なく常に同じであり、クエリ定義では属性のフルパス ( subject.concepts.name ) を使用しまし

于 2013-02-01T14:41:32.187 に答える
2

私はこれを個人的に試していないので暗闇で撮影しましたが、概念への完全なパスを試しましたか?

query2 = {
       "nested": {
           "path": "subjects.concepts",
           "score_mode": "avg",
           "query": {
               "bool": {
                   "must": [
                       {
                           "text": {"subjects.concepts.name": "concept1"}
                       },
                       {
                          "range": {"subjects.concepts.score": {"gt": 0}}
                       }
                   ]
               }
           }
       }
    } 
于 2013-02-01T14:26:07.877 に答える
0

JCJSの回答について質問があります。なぜあなたのマッピングはこれを好まないのですか?

mapping = {
    "subjects": {
        "type": "nested",
        "properties": {
            "concepts": {
                "type": "nested"
            }
        }
    }
}

2 つの型マッピングを定義しようとしましたが、うまくいかないかもしれませんが、平坦化されたデータになります。ネストされたプロパティにネストする必要があると思います..

最後に...このマッピングのネストされたクエリを使用すると、次のようになります...

{
    "query": {
        "nested": {
            "path": "subjects.concepts",
            "query": {
                "term": {
                    "name": {
                        "value": "concept1"
                    }
                }
            }
        }
    }
}

パス属性に使用full pathすることは重要ですが、用語キーはフルパスまたは相対パスにすることはできません。

于 2015-01-09T06:10:57.667 に答える