У нас есть эластичный поиск, сконфигурированный с помощью анализатора пробелов в нашем приложении. Слова лексемы на пробельном, поэтому имя как <fantastic> project
индексируются вИспользование Elastic Search для извлечения содержимого тегов и дефисных слов
["<fantastic>", "project"]
и ABC-123-определение проект индексируется в
["ABC-123-def", "project"]
Когда мы затем искать abc- * появляется ожидаемый проект. Но, если мы специально будем искать <fantastic>
, он вообще не появится. Как будто Lucene/Elastic Search игнорирует любой термин поиска, который включает угловые скобки. Однако, может найти fantastic
, или <*fantastic*
или *fantastic*
, и он находит это хорошо, хотя слово не индексируется отдельно от угловых скобок.
Стандартный анализатор выполняет токенизацию на любом не-алфавитно-цифровом символе. <fantatsic>
проект индексироваться
["fantastic", "project"]
и ABC-123-определения проекта индексируются
["ABC", "123", "def", "project"]
Это нарушает способность успешно поиск с помощью ABC-123-*
. Однако то, что мы получаем со стандартным анализатором, состоит в том, что кто-то может затем специально искать <fantastic>
и он возвращает желаемые результаты.
Если вместо стандартного анализатора мы добавим char_filter в пробельный анализатор, который отфильтровывает угловые скобки тегов, (замените <(.*)>
с $1
) он будет индексироваться таким образом: <fantatsic> project
индексируется в
["fantastic", "project"]
(без угловых кронштейнов). И ABC-123-определение проект индексируется в
["ABC-123-def", "project"]
Это выглядит многообещающим, но мы в конечном итоге с тем же результатом, что и для обычного пробельных анализатора: Когда мы ищем специально для <fantastic>
, мы не получим ничего, но *fantastic*
работает нормально.
Может ли кто-нибудь из переполнения стека объяснить эту странность?
Точно, что я искал, спасибо! – GLaDOS