3

タグのコレクションを持つ投稿の一般的な例を考えると、各タグを文字列以上のものにする必要があるとしましょう。ただし、文字列とそのタグの強度を示す double のタプルです。

1 つのクエリがどのように投稿し、タグの強度の合計に基づいてこれらをスコアリングするか (タグ名で正確な用語を検索していると仮定しましょう)

4

1 に答える 1

10

これは、タグをネストされたドキュメントとしてインデックス化し、ネストされたクエリをカスタム スコアクエリと組み合わせて使用​​することで実行できます。以下の例では、terms クエリは一致するタグを見つけ、カスタム スコア クエリは "tags" ドキュメントの "wight" フィールドの値をスコアとして使用し、ネストされたクエリはこれらのスコアの合計を最上位ドキュメントの最終スコアとして使用しています。 .

curl -XDELETE 'http://localhost:9200/test-idx'
echo
curl -XPUT 'http://localhost:9200/test-idx' -d '{
    "mappings": {
        "doc": {
            "properties": {
                "title": { "type": "string" },
                "tags": {
                    "type": "nested",
                    "properties": {
                        "tag": { "type": "string", "index": "not_analyzed" },
                        "weight": { "type": "float" }
                    }
                }
            }
        }
    }
}'
echo
curl -XPUT 'http://localhost:9200/test-idx/doc/1' -d '{
    "title": "1",
    "tags": [{
        "tag": "A",
        "weight": 1
    }, {
        "tag": "B",
        "weight": 2
    }, {
        "tag": "C",
        "weight": 4
    }]
}
'
echo
curl -XPUT 'http://localhost:9200/test-idx/doc/2' -d '{
    "title": "2",
    "tags": [{
        "tag": "B",
        "weight": 2
    }, {
        "tag": "C",
        "weight": 3
    }]
}
'
echo
curl -XPUT 'http://localhost:9200/test-idx/doc/3' -d '{
    "title": "3",
    "tags": [{
        "tag": "B",
        "weight": 2
    }, {
        "tag": "D",
        "weight": 4
    }]
}
'
echo
curl -XPOST 'http://localhost:9200/test-idx/_refresh'
echo
# Example with custom script (slower but more flexable)
curl -XGET 'http://localhost:9200/test-idx/doc/_search?pretty=true' -d '{
    "query" : { 
        "nested": {
            "path": "tags",
            "score_mode": "total",
            "query": {
                "custom_score": {
                    "query": {
                        "terms": {
                            "tag": ["A", "B", "D"],
                            "minimum_match" : 1
                        }
                    },
                    "script" : "doc['\''weight'\''].value"
                }
            }
        }
    },
    "fields": []
}'
echo
于 2012-10-27T01:17:00.947 に答える