Проанализировано против not_analyzed: размер хранилища
Недавно я начал использовать ElasticSearch 2. И, как я понимаю, анализируемый и not_analyzed в отображении, not_analyzed должен быть лучше в хранилище ( https://www.elastic.co/blog/elasticsearch-storage-the-true-story-2.0 и https://www.elastic.co/blog/elasticsearch-storage-the-true-story). В целях тестирования я создал несколько индексов со всем анализируемым полем String (по умолчанию), а затем я создал некоторые другие индексы со всеми полями, как not_analyzed. Я удивился, когда проверил размер индексов и увидел, что индексы с Строки not_analyzed были на 40% больше! Я вставлял одни и те же документы в каждый указатель (35000 документов).
Есть идеи, почему это происходит? Мои документы являются простыми документами JSON. У меня есть 60 полей String в каждом документе, которые я хочу установить как not_analyzed, и я попытался установить каждое поле как не проанализированное, а также создать динамический шаблон.
Я редактирую для добавления сопоставления, хотя я думаю, что в нем нет ничего особенного:
{
"mappings": {
"my_type" : {
"_ttl" : { "enabled" : true, "default" : "7d" },
"properties" : {
"field1" : {
"properties" : {
"field2" : {
"type" : "string", "index" : "not_analyzed"
}
more not_analyzed String fields here
...
...
...
}
3 ответа
not_analyzed
поля все еще проиндексированы. У них просто нет никаких преобразований, примененных к ним заранее ("анализ" - на языке Lucene).
В качестве примера:
(Док 1) "Быстрая коричневая лиса перепрыгнула через ленивую собаку"
(Док 2) "Ленивый как лис"
- Упрощенный список сообщений, созданный стандартным анализатором (по умолчанию для
analyzed
строковые поля - токены, нижний регистр, стоп-слова удалены):
"brown": [1]
"dog": [1]
"fox": [1,2]
"jumped": [1]
"lazy": [1,2]
"over": [1]
"quick": [1]
Строковые данные на 30 символов
- Упрощенный список сообщений, созданный
"index": "not_analyzed"
:
"The quick brown fox jumped over the lazy dog": [1]
"Lazy like the fox": [2]
Строковые данные на 62 символа
Анализ приводит к тому, что входные данные становятся токенизированными и нормализованными для возможности поиска документов с использованием термина.
Но в результате единица текста сокращается до нормализованного термина (против целого поля с not_analyzed
), и все избыточные (нормализованные) термины во всех документах объединяются в один логический список, сохраняя все пространство, которое обычно будет занимать повторяющиеся термины и стоп-слова.
Из документации это выглядит так not_analyzed
заставляет поле действовать как "ключевое слово" вместо "полнотекстового" поля - давайте сравним эти два!
Полный текст
Эти поля анализируются, то есть передаются через анализатор для преобразования строки в список отдельных терминов перед индексацией.
Ключевое слово
Поля ключевых слов не анализируются. Вместо этого точное значение строки добавляется к индексу как один термин.
Я не удивлен, что сохранение всей строки как термина, а не разбиение ее на список терминов не обязательно приводит к экономии места. Честно говоря, это, вероятно, зависит от анализатора индекса и индексируемой строки.
В качестве примечания, я только что переиндексировал около миллиона документов производственных данных и сократил использование дискового пространства на ~95%. Основное различие, которое я сделал, было изменение того, что было фактически сохранено в источнике (AKA сохранен). Мы проиндексировали PDF-файлы для поиска, но не нуждались в их возврате, что избавило нас от сохранения этой информации двумя различными способами (проанализированными и необработанными). Есть некоторые очень реальные недостатки этого, так что будьте осторожны!
Doc1{ "name":"меня зовут Mayank Kumar"}
Doc2. {"Name": "mayank"}
Doc3. {"Name":"Mayank" }
У нас есть 3 документа.
Поэтому, если поле 'name' равно 'not_analyzed' и мы ищем 'mayank', будет возвращен только второй документ. Если мы ищем 'Mayank', будет возвращен только третий документ.
Если поле 'имя' 'анализируется' анализатором 'анализатор нижнего регистра' (просто в качестве примера). Мы ищем 'mayank', будут возвращены все 3 документа. Если мы ищем "kumar", будет возвращен первый документ. Это происходит потому, что в первом документе значение поля маркируется как "my" "name" "is" "mayank" "kumar"
"not_analyzed" в основном используется для "полнотекстового" поиска (в основном, за исключением сопоставления с подстановочными знаками). свободного места на диске. Занимает меньше времени при индексации.
"Анализ" в основном используется для сопоставления документов. Больше места на диске (если поля анализа большие). Занимает больше времени при индексации. (Больше полей из-за полей анализа)