0

文字列のリストを含む配列フィールドがあります。つまり、["NY", "CA"]

検索時に、配列内の文字列のいずれかに一致するフィルターがあります。

検索文字列「NY」の出現回数が最も多いドキュメントに基づいて結果を並べ替えたい

ドキュメント 1: ["CA", "NY", "NY"] ドキュメント 2: ["NY", FL"] ドキュメント 3: ["NY", CA", "NY", "NY"]

結果はそのように順序付けする必要があります

ユーザー 3、ユーザー 1、ユーザー 2

これは可能ですか?もしそうなら、どのように?

4

2 に答える 2

1

好奇心旺盛な方のために説明すると、配列内で単語が何回出現するかに基づいてブーストすることはできませんでした。ただし、次のことで必要なことを達成しました。

curl -X POST "http://localhost:9200/index/document/1" -d '{"id":1,"states_ties":["CA"],"state_abbreviation":"CA","worked_in_states":["CA"],"training_in_states":["CA"]}'
curl -X POST "http://localhost:9200/index/document/2" -d '{"id":2,"states_ties":["CA","NY"],"state_abbreviation":"FL","worked_in_states":["NY","CA"],"training_in_states":["NY","CA"]}'
curl -X POST "http://localhost:9200/index/document/3" -d '{"id":3,"states_ties":["CA","NY","FL"],"state_abbreviation":"NY","worked_in_states":["NY","CA"],"training_in_states":["NY","FL"]}'

curl -X GET 'http://localhost:9200/index/_search?per_page=10&pretty' -d '{
  "query": {
    "custom_filters_score": {
      "query": {
        "terms": {
          "states_ties": [
            "CA"
          ]
        }
      },
      "filters": [
        {
          "filter": {
            "term": {
              "state_abbreviation": "CA"
            }
          },
          "boost": 1.03
        },
        {
          "filter": {
            "terms": {
              "worked_in_states": [
                "CA"
              ]
            }
          },
          "boost": 1.02
        },
        {
          "filter": {
            "terms": {
              "training_in_states": [
                "CA"
              ]
            }
          },
          "boost": 1.01
        }
      ],
      "score_mode": "multiply"
    }
  },
  "sort": [
    {
      "_score": "desc"
    }
  ]
}'

results: id: score

1: 0.75584483
2: 0.73383
3: 0.7265643
于 2013-03-12T22:04:14.543 に答える
0

これは、標準の Lucene スコアリングの実装によって実現されます。順序を指定せずに単に "NY" を検索した場合、関連性で並べ替えられ、他のすべてが等しい場合に、用語の出現回数が多いドキュメントに関連性​​が最も高く割り当てられます。

于 2013-03-11T16:19:43.443 に答える