Соответствие индекса в запросе - PullRequest
0 голосов
/ 05 мая 2020

У меня есть строка, и я хотел бы найти самое длинное совпадение в этой строке со значением строки таблицы. В SQL этот запрос работает нормально:

SELECT model, LENGTH(model) AS size 
FROM models 
WHERE 'Acer Aspire 3 A315-42' LIKE CONCAT('%', model, '%') 
ORDER BY size DESC 
LIMIT 1;

Но он медленный. Elasticsearch находит совпадения запроса в индексе, но мне нужно совпадение индекса в запросе. Есть ли решение в elasticsearch?

1 Ответ

0 голосов
/ 05 мая 2020
Поле

скрипта может использоваться для сортировки текста по длине. Лучшим вариантом было бы также проиндексировать длину текста и отсортировать по этому полю.

Данные:

"hits" : [
      {
        "_index" : "index16",
        "_type" : "_doc",
        "_id" : "QNLN5HEB9UrRQjNWOLGw",
        "_score" : 1.0,
        "_source" : {
          "model" : "Acer Aspire 3 A315-42  aa"
        }
      },
      {
        "_index" : "index16",
        "_type" : "_doc",
        "_id" : "QdLN5HEB9UrRQjNWQLFu",
        "_score" : 1.0,
        "_source" : {
          "model" : "Acer Aspire 3 A315-42"
        }
      }
    ]

Запрос:

{
  "query": {
    "match": {
      "model": "Acer Aspire 3 A315-42"
    }
  },
  "sort": [
    {
      "_script":{
        "script": "doc['model.keyword'].value.length()",-->script to return length
        "type": "number",
        "order": "desc"
      }
    }
  ],
  "size": 1 --> top 1
}

Результат:

"hits" : [
      {
        "_index" : "index16",
        "_type" : "_doc",
        "_id" : "QNLN5HEB9UrRQjNWOLGw",
        "_score" : null,
        "_source" : {
          "model" : "Acer Aspire 3 A315-42  aa"
        },
        "sort" : [
          25.0
        ]
      }
    ]
...