Подтвердить что ты не робот

Почему поле Elasticsearch "not_analyzed" разделено на термины?

У меня есть следующее поле в определении отображения:

...
"my_field": {
  "type": "string",
  "index":"not_analyzed"
}
...

Когда я индексирую документ со значением my_field = 'test-some-another', это значение разбивается на 3 члена: test, some, another.

Что я делаю неправильно?

Я создал следующий индекс:

curl -XPUT localhost:9200/my_index -d '{
   "index": {
    "settings": {
      "number_of_shards": 5,
      "number_of_replicas": 2
    },
    "mappings": {
      "my_type": {
        "_all": {
          "enabled": false
        },
        "_source": {
          "compressed": true
        },
        "properties": {
          "my_field": {
            "type": "string",
            "index": "not_analyzed"
          }
        }
      }
    }
  }
}'

Затем я индексирую следующий документ:

curl -XPOST localhost:9200/my_index/my_type -d '{
  "my_field": "test-some-another"
}'

Затем я использую плагин https://github.com/jprante/elasticsearch-index-termlist со следующим API: curl -XGET localhost:9200/my_index/_termlist Это дает мне следующий ответ:

{"ok":true,"_shards":{"total":5,"successful":5,"failed":0},"terms": ["test","some","another"]}

код >

4b9b3361

Ответ 1

Убедитесь, что на самом деле отображение выполняется при запуске:

curl localhost:9200/my_index/_mapping?pretty=true

Команда, создающая индекс, кажется неправильной. Он не должен содержать "index" : { как корневой элемент. Попробуйте следующее:

curl -XPUT localhost:9200/my_index -d '{
  "settings": {
    "number_of_shards": 5,
    "number_of_replicas": 2
  },
  "mappings": {
    "my_type": {
      "_all": {
        "enabled": false
      },
      "_source": {
        "compressed": true
      },
      "properties": {
        "my_field": {
          "type": "string",
          "index": "not_analyzed"
        }
      }
    }
  }
}'  

Ответ 2

В ElasticSearch поле индексируется, когда оно входит в инвертированный индекс, структуру данных, которую использует lucene для обеспечения своих возможностей быстрого и полного полнотекстового поиска. Если вы хотите искать в поле, вам нужно его проиндексировать. Когда вы индексируете поле, вы можете решить, хотите ли вы его индексировать, или хотите его проанализировать, что означает принятие к нему токенизатора, который будет генерировать список токенов (слов) и список токенов фильтры, которые могут изменять сгенерированные токены (даже добавлять или удалять некоторые). То, как вы индексируете поле, влияет на то, как вы можете его искать. Если вы индексируете поле, но не анализируете его, и его текст состоит из нескольких слов, вы сможете найти этот документ только для поиска именно того конкретного текста, включая пробелы.

У вас могут быть поля, которые вы хотите искать, и никогда не показывать: индексируются и не сохраняются (по умолчанию в lucene). У вас могут быть поля, которые вы хотите искать, а также извлекать: индексированные и сохраненные. У вас могут быть поля, которые вы не хотите искать, но вы хотите их отобразить.