Проанализировано или не проанализировано, что выбрать
Я использую только kibana для поиска ElasticSearch, и у меня есть несколько полей, которые могут принимать только несколько значений (наихудший случай, имя сервера, 30 различных значений).
Я понимаю, что анализ делает с большими, более сложными полями, как это, но с маленькими и простыми я не могу понять преимущества / недостатки анализируемых / не_анализируемых полей.
Итак, каковы преимущества использования analysed и not_analyzed для поля "ограниченный набор значений" (пример. Имя_сервера: server[0-9]*, без специальных символов для разбиения)? Какие типы поиска я потеряю в кибане? Получу ли я какую-либо скорость поиска или дисковое пространство?
Тестируя один из них, я увидел, что версия поля.raw теперь пуста, но kibana по-прежнему помечает поле как проанализированное, поэтому я считаю, что мои тесты неубедительны.
1 ответ
Я постараюсь сделать это проще, если вам нужно больше разъяснений, просто дайте мне знать, и я разработаю лучший ответ.
В поле "анализ" будет создан токен с использованием анализатора, который вы определили для этой конкретной таблицы в вашем отображении. если вы используете анализатор по умолчанию (поскольку вы ссылаетесь на что-то без специальных символов, скажем, сервер [1-9]), то использование анализатора по умолчанию (alnum-lowercase word-braker(это не имя, а то, что он делает в основном)) собираюсь токенизировать:
this -> HelloWorld123
into -> token1:helloworld123
OR
this -> Hello World 123
into -> token1:hello && token2:world && token3:123
в этом случае, если вы выполните поиск: HeL10, он станет -> "привет" и будет соответствовать этому документу, потому что токен "привет" есть.
в случае полей not_analized он вообще не применяет токенизатор, ваш токен - это ваше ключевое слово, так что, как говорится:
this -> Hello World 123
into -> token1:(Hello World 123)
если вы ищете в этом поле "привет мир 123"
не подходит, потому что "чувствителен к регистру" (хотя вы все равно можете использовать подстановочные знаки (Hello*), давайте рассмотрим это в другой раз).
в двух словах:
используйте "проанализированные" поля для полей, которые вы собираетесь искать, и вы хотите, чтобы эластичный поиск их оценил. Пример: заголовки, содержащие слово "работа". запрос:"название: работа".
doc1 : title:developer jobs in montreal
doc2 : title:java coder jobs in vancuver
doc3 : title:unix designer jobs in toronto
doc4 : title:database manager vacancies in montreal
это будет собирать title1 title2 title3.
в этих случаях "анализируемые" поля - это то, что вы хотите.
если вы заранее знаете, какие данные будут находиться в этом поле, и будете запрашивать именно то, что вам нужно, тогда вам нужно "not_analyzed".
пример:
получить все журналы от server123.
запрос:"Сервер:server123".
doc1 :server:server123,log:randomstring,date:01-jan
doc2 :server:server986,log:randomstring,date:01-jan
doc3 :server:server777,log:randomstring,date:01-jan
doc4 :server:server666,log:randomstring,date:01-jan
doc5 :server:server123,log:randomstring,date:02-jan
результаты только от server1 и server5.
и я надеюсь, вы поняли суть. как я сказал, будь проще, это то, что тебе нужно.
проанализировано -> больше места на диске (БОЛЬШЕ, если большие поля анализа). проанализировано -> больше времени для индексации. проанализировано -> лучше для сопоставления документов.
not_analyzed -> меньше места на диске. not_analyzed -> меньше времени для индексации. not_analyzed -> точное совпадение полей или использование подстановочных знаков.
С Уважением,
Даниил