Проанализировано против 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) "Ленивый как лис"


  1. Упрощенный список сообщений, созданный стандартным анализатором (по умолчанию для analyzed строковые поля - токены, нижний регистр, стоп-слова удалены):
"brown": [1]  
"dog": [1]  
"fox": [1,2]  
"jumped": [1]  
"lazy": [1,2]  
"over": [1] 
"quick": [1]

Строковые данные на 30 символов


  1. Упрощенный список сообщений, созданный "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" в основном используется для "полнотекстового" поиска (в основном, за исключением сопоставления с подстановочными знаками). свободного места на диске. Занимает меньше времени при индексации.

"Анализ" в основном используется для сопоставления документов. Больше места на диске (если поля анализа большие). Занимает больше времени при индексации. (Больше полей из-за полей анализа)

Другие вопросы по тегам