Я пытаюсь использовать Индекс Cassandra Lucene Stratio для создания функции автозаполнения для адресов, но до сих пор мне удавалось получить только те результаты, которые соответствуют названиям улиц.
Разработка:
В своей таблице я (возможно, неправильно) создал текстовое поле fullAddress (т. Е. Поле, значением которого является объединение других полей, таких как streetName , houseNumber , почтовый индекс и т. Д.).
Затем я создаю свой индекс следующим образом:
CREATE CUSTOM INDEX address_lucene_index ON address.address ()
USING 'com.stratio.cassandra.lucene.Index'
WITH OPTIONS = {
'refresh_seconds': '1',
'schema': '{
fields: {
fulladdress: {type: "text"}
}
}'
};
Затем я выдаю следующий запрос:
SELECT * FROM address.address WHERE expr(address_lucene_index, {query: {type: "fuzzy", field: "fulladdress", value: "<SEARCH_STRING>"}})
Поведение выглядит следующим образом:
- Если SEARCH_STRING = несколько букв названия улицы, существующего в базе данных, я получаю ряд релевантных результатов. Это хорошо.
- Если SEARCH_STRING = название улицы + номер дома (fx: "Mainroad 3"), я не получаю никаких результатов, даже если база данных содержит адрес "Mainroad 3, 3rd floor". Каким-то образом написание более точного адреса улицы не приводит к совпадению.
Я новичок в Люсене и Кассандре. Мой текущий поиск онлайн-поддержки нацелен на поисковые термины, такие как анализаторы Lucene и токенизаторы. Но я мог бы помочь с общим направлением. Возможно, мне не следует использовать это синтетическое fullAddress поле, а создать индекс по отдельным полям компонента адреса?
РЕДАКТИРОВАТЬ: Вышеупомянутый подход фактически работает частично, в том смысле, что действительно возвращает некоторые совпадения также при вводе названия улицы + номера дома. Однако решение это все же не твердое. Fx, введя весь адрес, не возвращает совпадений.