ElasticSearch повышает релевантность на основе количества значений поля - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь повысить релевантность на основе количества значений поля. Чем меньше значение поля, тем больше значение.

Например, у меня есть 1001 документ. 1000 документов написано Джоном, и только один написан Джо.

// 1000 documents by John
{"title": "abc 1", "author": "John"}
{"title": "abc 2", "author": "John"}
// ...
{"title": "abc 1000", "author": "John"}

// 1 document by Joe
{"title": "abc 1", "author": "Joe"}

Я получу 1001 документ при поиске «abc» в поле заголовка. Эти документы должны иметь примерно одинаковую оценку релевантности, если они не совпадают. Счетчик значения поля «Джон» равен 1000, а счетчик значения поля «Джо» равен 1. Теперь я хотел бы повысить релевантность документа {"title": "abc 1", "author": "Joe"}, в противном случае документ будет действительно трудно увидеть с автором Джо.

Спасибо!

1 Ответ

0 голосов
/ 06 июня 2018

В случае, если кто-то столкнется с тем же вариантом использования, я объясню мой обходной путь, используя Запрос показателя функции .Таким образом, будет сделано как минимум два вызова на сервер Elasticsearch.

  1. Получите счет для каждого человека (Вы можете использовать функцию агрегации).В нашем примере мы получаем 1000 от Джона и 1 от Джо.
  2. Сгенерируйте вес по счетам.Чем больше рассчитывает, тем меньше вес релевантности.Что-то вроде 1 + sqrt(1/1000) для Джона и 1 + sqrt(1/1) для Джо.
  3. Используйте вес в сценарии, чтобы вычислить оценку в соответствии со значением автора (сценарий может быть намного лучше):

    {
    "query": {
        "function_score": {
            "query": {
                "match": { "title": "abc" }
            },
            "script_score" : {
                "script" : {
                  "inline": "if (doc['author'].value == 'John') {return (1 + sqrt(1/1000)) * _score}\n return (1 + sqrt(1/1)) * _score;"
                }
            }
        }
    }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...