Единственное место, где вам требуется манипулирование счетом - это точное совпадение, в противном случае порядок по положениям дает вам правильный порядок.Давайте поймем это следующим образом:
Давайте сначала создадим отображение, как показано ниже:
PUT test
{
"mappings": {
"_doc": {
"properties": {
"my_field1": {
"type": "text",
"analyzer": "whitespace",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
У меня есть поле create my_field1
с анализатором whitespace
, чтобы убедиться, что токены созданы с помощьюпробел как единственный разделитель.Во-вторых, я создал подполе с именем keyword
типа keyword
.keyword
будет содержать не проанализированное значение входной строки, и мы будем использовать его для точного соответствия.
Позволяет добавить несколько документов в индекс:
PUT test/_doc/1
{
"my_field1": "apple"
}
PUT test/_doc/2
{
"my_field1": "apple tree"
}
PUT test/_doc/3
{
"my_field1": "green apple"
}
Если использовать нижезапрос для поиска термина apple
порядок документов будет 2,1,3.
POST test/_doc/_search
{
"explain": true,
"query": {
"query_string": {
"query": "apple",
"fields": [
"my_field1"
]
}
}
}
"explain": true
в приведенном выше запросе дают шаги вычисления оценки в выходных данных.Прочитав это, вы поймете, как оценивается документ.
Все, что нам нужно сделать, это повысить счет для точного соответствия.Мы проведем точное совпадение с полем my_field1.keyword
.У вас может возникнуть вопрос, почему бы не my_field1
.Причина этого заключается в том, что анализируется my_field1
, когда для входных строк 3 документов генерируются токены, у всех будет токен (термин) apple
(вместе с другими терминами, если они есть, например, tree
для документа 2и green
для документа 3) хранится в этом поле.Когда мы выполняем точное совпадение в этом поле для термина apple
, все документы будут совпадать и оказывать одинаковое влияние на оценку для каждого документа и, следовательно, не будет изменений в оценке.Поскольку только один документ имеет точное значение apple
против my_field1.keyword
, этот документ (doc 1) будет соответствовать точному запросу, и мы увеличим его.Таким образом, запрос будет:
{
"query": {
"bool": {
"should": [
{
"query_string": {
"query": "apple",
"fields": [
"my_field1"
]
}
},
{
"query_string": {
"query": "\"apple\"",
"fields": [
"my_field1.keyword^2"
]
}
}
]
}
}
}
Выходные данные для запроса выше:
{
"took": 9,
"timed_out": false,
"_shards": {
"total": 5,
"successful": 5,
"skipped": 0,
"failed": 0
},
"hits": {
"total": 3,
"max_score": 1.7260925,
"hits": [
{
"_index": "test3",
"_type": "_doc",
"_id": "1",
"_score": 1.7260925,
"_source": {
"my_field1": "apple"
}
},
{
"_index": "test3",
"_type": "_doc",
"_id": "2",
"_score": 0.6931472,
"_source": {
"my_field1": "apple tree"
}
},
{
"_index": "test3",
"_type": "_doc",
"_id": "3",
"_score": 0.2876821,
"_source": {
"my_field1": "green apple"
}
}
]
}
}