Katakanlah saya memiliki dokumen-dokumen ini di Elasticsearch:

{
    "display_name": "Jose Cummings",
    "username": "josecummings"
},
{
    "display_name": "Jose Ramirez",
    "username": "elite_gamer"
},
{
    "display_name": "Lance Abrams",
    "username": "abrams1"
},
{
    "display_name": "Steve Smith",
    "username": "josesmose"
}

Saya ingin menjalankan penelusuran "saat Anda mengetik" untuk Jose yang menelusuri bidang display_name dan username, yang dapat saya lakukan dengan ini:

{
    "query": {
        "bool": {
            "must": {
                "multi_match": {
                    "fields": [
                        "display_name",
                        "username"
                    ],
                    "query": "Jose",
                    "type": "bool_prefix",
                    "fuzziness": "AUTO",
                    "boost": 50
                }
            }
        }
    }
}

Masalahnya di sini adalah ketika saya mencari Jose, Jose Cummings mendapat 100 poin sementara Jose Ramirez dan Steve Smith hanya mendapatkan 50 poin, karena sepertinya menjumlahkan skor untuk dua bidang. Ini pada dasarnya memberi penghargaan kepada pengguna karena memiliki display_name yang sama dengan username, yang tidak kami inginkan terjadi.

Apakah ada cara untuk hanya mengambil skor maksimal dari dua bidang? Saya telah mencoba lusinan kombinasi yang berbeda sekarang menggunakan function_score, boost_mode/score_mode, constant_score, mencoba melakukan should kecocokan dengan beberapa match_bool_prefix kueri, dll. Sepertinya tidak ada yang saya coba untuk mencapai ini.

1
Josh 8 Juli 2020, 23:29

1 menjawab

Jawaban Terbaik

Coba ini:

{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "fields": [
              "display_name^50",
              "username^50"
            ],
            "query": "Jose",
            "type": "bool_prefix",
            "fuzziness": "AUTO",
            "tie_breaker": 0.3
          }
        }
      ]
    }
  }
}

Perhatikan efek dari tie_breaker disetel ke 0,0 sebagai lawan 0


Perhatikan juga bahwa bool_prefix

penilaian berperilaku seperti most_fields, tetapi menggunakan kueri match_bool_prefix alih-alih kueri match.

Mungkin Anda memang ingin agar kolom diberi awalan dengan jose. Tetapi jika nama pengguna, katakanlah, cool_jose, itu akan ditinggalkan (kecuali jika Anda misalnya menerapkan penganalisis)...

1
Joe Sorocin 9 Juli 2020, 10:37