Для поиска по фразе мы хотим выводить результаты, только если есть точное совпадение (без игнорирования стоп-слов). Если это поиск не по фразе, то мы можем отобразить результаты, даже если корневая форма слова соответствует и т. Д.
В настоящее время мы передаем наши данные через стандартные токенайзеры, StopFilter, PorterStemFilter и LowerCaseFilter. В связи с этим, когда пользователь хочет найти «управление паролем», поиск выводит результаты, содержащие «менеджер паролей».
Если я удалю StemFilter, я не смогу найти соответствие для корневой формы слова для несфразовых запросов. Я думал, если я должен индексировать те же данные, как часть двух полей в документе.
Для первого поля (которое будет использоваться для поиска фраз) будут использоваться следующие токенизаторы / фильтры:
Стандартный токенайзер, LowerCaseFilter
Для второго поля (поиск без фразы)
Стандартный токенайзер, StopFilter, PorterStemFilter, LowerCaseFilter
Теперь, основываясь на поиске фразы или нет, мне нужно переписать запрос пользователя для поиска в соответствующем поле.
Это правильный способ решения этой проблемы? Есть ли другой способ добиться этого без удвоения размера индекса?
допустим, запрос пользователя
summary:"Furthermore, we should also fix this"
Внутренне это будет переведено на
summary_field1:"Furthermore, we should also fix this"
Если запрос пользователя
summary:(Furthermore, we should also fix this)
Внутренне это будет переведено на
+summary_field2:furthermor +summary_field2:we +summary_field2:should +summary_field2:also +summary_field2:fix
и summary_field1, и summary_field2 индексируют одни и те же данные. summary_field1 проходит только через StandardTokenizer и LowerCaseFilter, тогда как summary_field2 проходит через StandardTokenizer, StopFilter, PorterStemFilter и LowerCaseFilter.
Пожалуйста, дайте мне знать, если я что-то здесь упускаю.