0

配列を含む Elastic Search でドキュメントのインデックスを作成しています。

サンプル文書:

doc1:
{
  ...
  actors: ["Tom Cruise", "Brad Pitt", ...],
  ...
}

doc2:
{
  ...
  actors: ["Brad Pitt", "Tom Cruise", ...],
  ...
}

このようなドキュメントを検索する場合、配列内の一致する位置に依存するスコアが必要です。つまり、サンプル ドキュメントでは、"Tom Cruise" を検索すると最初のドキュメントがブーストされるはずです。doc1これは、一致する位置が であるためです1

私が今考えることができる唯一の解決策は、最初のアクターを含む限られた数のフィールド (5 のようなもの) を追加し、次のようなブーストを配置することです。

doc1:
{
  ...
  actors: ["Tom Cruise", "Brad Pitt", ...],
  actor1: "Tom Cruise",
  actor2: "Brad Pitt",
  ...
}

、、などactor1のブーストがあります。5actor2 4

おそらく使用して、それを処理するためのより良い解決策がありcustom_scoreますか?

ありがとう !

4

1 に答える 1

1

これを考えると

curl -XPOST localhost:9200/films

curl -XPOST localhost:9200/films/film/1 -d'{
    actors: ["Tom Cruise", "Brad Pitt", "Patrick Stewart", "Christopher Walken"]
}'
curl -XPOST localhost:9200/films/film/2 -d'{
    actors: ["Brad Pitt", "Patrick Stewart", "Tom Cruise", "Christopher Walken"]
}'

次に、このクエリ

{
    "query":{
        "custom_score":{
            "query": {"match_all":{}},
            "script":"length = _source.actors.size();
            found = false; index=0;
            while(!found && index<length){
              if(_source.actors[index] == target){
                found=true;
              }
              else{
                index+=1
              }
            }
            length - index;",
            "params":{
                "target": "Tom Cruise"
            }
        }
    }
}

最初のフィルムのスコアは 4、最後のフィルムのスコアは 2 と計算されます (これを curl に貼り付ける場合は、カスタム スクリプトのすべての改行を削除する必要がありました)。

いくつかの注意事項:

  • おそらく、オフセットをスコアに変換するより良い方法が必要です。このコードは をlength - offsetスコアとして返すため、実際には同じ長さのものしか比較できません
  • (つまり、インデックス付きデータ) はアルファベット順に並べ替えられたバージョンの配列しかないように見えますがdoc.actors、これは明らかに役に立ちません_source。custom_score クエリがフィルター処理されたクエリをラップする場合は、パフォーマンス的に許容できる場合があります。
于 2012-06-06T23:48:06.420 に答える