Elasti c Поиск по нескольким полям с совпадениями по нечеткости и сортировка по нескольким полям, объединенные оценки - PullRequest
3 голосов
/ 29 мая 2020

Я работаю с Elasti c Искать в Laravel в моем индексе 3 поля text,mood,haloha_id. Сначала я хочу сопоставить "haloha_id" (рассматривайте haloha_id как сообщение, а текст как комментарии к этому сообщению), если совпадение, затем выполните дальнейшее сопоставление. предположим, что теперь соответствует "haloha_id". Я хочу сопоставить подстроку в поле «текст», а затем сопоставить «настроение» (целое число либо 0,1,2 et c) «настроение должно совпадать, только если какой-либо из» текста "в противном случае не соответствует. Я делаю запрос Like Mine, это означает, что комментарии, соответствующие комментариям пользователя для указанного c сообщения, будут отображаться только. Проблема в моем запросе заключается в том, что

  • Мои собственные комментарии не отображаются вверху, следовательно, они совпадают 100%

  • Если чьи-то «настроение» и «комментарии» совпадают на 100% с моими, то они не отображаются в верхней части .

    Я удалил запрос, связанный с «настроением», но оценка не имеет никакого эффекта, это означает, что оценка не включает оценку по настроению.

Вот мой запрос.

 "query"=>[      

    "bool"=>[                                
        "should"=>[
            "match"=>[
                "text"=>[
                    "query"=>$userHaloha->filtered_text,
                    "fuzziness"=>"AUTO",                
                ]
            ]                           
        ],
        "minimum_should_match"=>1,
        "must"=>[
            "match"=>[
                "mood"=>$userHaloha->mood,            
            ],
            "match"=>[
                "haloha_id"=>$userHaloha->haloha_id
            ]
        ] 

1 Ответ

1 голос
/ 29 мая 2020

Запрос не требует пояснений. Я добавил «haloha_id» в блок фильтра (который не оценивает документы), «текст», который необходимо заблокировать (для оценки документов) и «настроение», чтобы заблокировать (для повышения документов).

{
  "query": {
    "bool": {
      "filter": [
        {
          "match": {
            "haloha_id": "5ecf6bff25a36366cd134db2"
          }
        }
      ],
      "must": [
        {
          "match": {
            "text": {
              "query": "chilli ",
              "fuzziness": "auto"
            }
          }
        }
      ],
      "should": [
        {
          "term": {
            "mood": {
              "value": 2
            }
          }
        }
      ]
    }
  }
}

Проблема в настроение: 3 получает более высокий рейтинг, чем настроение: 2 (искомый термин в предложении следует) из-за сегментирования

From docs

Если вы заметили, что два документа с одним и тем же контентом получают разные оценки или точное совпадение не занимает первое место, тогда проблема может быть связана с сегментированием. По умолчанию Elasticsearch делает каждый сегмент ответственным за создание собственных оценок. Однако, поскольку статистика индекса вносит важный вклад в оценку, это работает хорошо только в том случае, если шарды имеют аналогичную статистику индекса. Предполагается, что, поскольку по умолчанию документы маршрутизируются на сегменты равномерно, статистика индекса должна быть очень похожей, и оценка будет работать должным образом. Однако если вы:

используете маршрутизацию во время индекса, запрашиваете несколько индексов или имеете слишком мало данных в вашем индексе, тогда есть хорошие шансы, что все шарды, участвующие в поисковом запросе, не имеют подобная статистика индекса и релевантность могут быть плохими.

Если у вас небольшой набор данных, самый простой способ обойти эту проблему - проиндексировать все в индексе, имеющем один сегмент (index.number_of_shards: 1), что по умолчанию. Тогда статистика индекса будет одинаковой для всех документов и оценки будут согласованными.

...