Причина, по которой оба документа имеют одинаковую оценку, заключается в том, что поле автора представляет собой массив текстовых значений.Если мы изменим способ хранения авторов, мы можем получить желаемый результат.Для этого давайте создадим авторов как вложенный тип.Итак, у нас есть следующее отображение:
"mappings": {
"_doc": {
"properties": {
"authors": {
"type": "nested",
"properties": {
"name": {
"type": "text",
"fields": {
"raw": {
"type": "keyword"
}
}
}
}
}
}
}
}
Примечание : Подполе raw может бытьиспользуется для некоторых других сценариев и не имеет отношения к решению.
Теперь давайте индексировать документы, как показано ниже:
Документ 1:
{
"authors": [
{
"name": "Paul Tompkins"
},
{
"name": "Dietrich Kohl"
}
]
}
Документ 2:
{
"authors": [
{
"name": "Paul Wang"
},
{
"name": "Darlene Tompkins"
}
]
}
Позволяет запросить их следующим образом:
{
"explain": true,
"query": {
"nested": {
"path": "authors",
"query": {
"query_string": {
"query": "paul l tompkins",
"fields": [
"authors.name"
]
}
}
}
}
}
Результат:
"hits": {
"total": 2,
"max_score": 1.3862944,
"hits": [
{
"_index": "test",
"_type": "_doc",
"_id": "1",
"_score": 1.3862944,
"_source": {
"authors": [
{
"name": "Paul Tompkins"
},
{
"name": "Dietrich Kohl"
}
]
}
},
{
"_index": "test",
"_type": "_doc",
"_id": "2",
"_score": 0.6931472,
"_source": {
"authors": [
{
"name": "Paul Wang"
},
{
"name": "Darlene Tompkins"
}
]
}
}
]
}
ПРИМЕЧАНИЕ. В запросе, который я также использовал объяснение:правда .Это дает объяснение расчета баллов (я не включил вывод объяснения выше, так как он очень длинный. Вы можете попробовать его).
Когда мы смотрим на механизм подсчета очков, мы видим разницупри выполнении запросов к вложенному полю и при выполнении запросов к массиву.Вообще говоря, поскольку вложенные поля хранятся в виде отдельных документов, Документ 1 оценивается выше, поскольку дочерний документ 1, т. Е.
{
"name": "Paul Tompkins"
}
, будет иметь более высокий балл, поскольку оба термина paul и tompkins находятся в одном и том же дочернем документе.
В случае массива все имена принадлежат одному и тому же полю, а не отдельным дочерним документам и, следовательно, разнице.
Таким образом, мы можем достичь желаемого результата.