Заставьте lucene рассматривать все термины в поле как один термин
-
03-07-2019 - |
Вопрос
В моих документах Lucene у меня есть поле "компания", где название компании обозначено токеном.Мне нужна токенизация для определенной части моего приложения.Но для этого запроса мне нужно иметь возможность создать PrefixQuery для всего поля company.
Пример:
- Мой Бренд
- мой
- Бренд
- ферма браминов
- брамин
- Ферма
Регулярный запрос "bra" вернул бы оба документа, потому что в них обоих есть термин, начинающийся с bra.
Однако результат, который я хочу получить, вернет только последнюю запись, потому что первый термин начинается с bra.
Есть какие-нибудь предложения?
Решение
Используйте СпанКвери для поиска используется только позиция первого термина.Запрос префикса, обернутый SpanMultiTermQueryWrapper, обернутый SpanPositionRangeQuery:
<SpanPositionRangeQuery: spanPosRange(SpanMultiTermQueryWrapper(company:bra*), 0, 1)>
Другие советы
Создайте еще одно индексированное поле, в котором будет указано название компании. нет маркированный.При необходимости выполните поиск по этому полю, а не по полю с символическим названием компании.
Если вы хотите быстрого поиска, вам необходимо иметь индексные записи, которые указывают непосредственно на интересующие записи.Возможно, вы сможете что-то сделать с данными о близости для фильтрации записей, но это будет медленно.Я вижу проблему в следующем:как можно эффективно выполнить запрос "содержит" по полному полю?
Возможно, вам удастся свести к минимуму увеличение размера индекса, создав (для каждого текущего поля) поле "первый термин" и поле "остальные термины".Это позволило бы исключить дублирование первого термина в двух областях.Для "обычных" запросов вы ищете условия запроса в любом из этих полей.Для запросов "startswith" выполняется поиск только по полю "первый термин".Но, похоже, от этого больше проблем, чем пользы.