Хорошая штука ElasticSearch, только вот видимо все силы отдали написанию кода, а на документацию ни сил, ни времени не хватило.
Задача: создать индекс для поиска, в котором поиск по некоторым полям будет осуществляться с использованием синонимов. Синонимы будут использоваться только во время поиска, но не во время создания индекса.
Для создяния конфига была использована информация главным образом из второго пункта списка литературы.
Процедура следующая:
1. Для изменения индекса его первым делом необходимо остановить:
curl -XPOST 'http://localhost:9200/test_direct/_close'
2. Создаем конфигурацию и обновляем настройки индекса командой :
curl -XPUT 'localhost:9200/pocket_dwh_direct/_settings' -d ' {'settings': { "index": { "analysis" : { "analyzer" : { "my_search_analyzer" : { "tokenizer" : "whitespace", "filter" : ["standard", "asciifolding", "lowercase", "kstem", "search_synonym"] } }, "filter" : { "search_synonym" : { "ignore_case" : "true", "type" : "synonym", "synonyms" : ["aaaa , bbb, ccc"] } } } } }, "mappings": { "mydoc_data": { "properties": { "mysocName": { "type": "string", "index_analyzer": "standard", "search_analyzer": "my_search_analyzer" }, "mydocSecondName": { "type": "string", "index_analyzer": "standard", "search_analyzer": "my_search_analyzer" } } } } }'
немного пояснений:
{ 'settings': { "index": { "analysis" : {"analyzer" : {// Просто конфигурация синтаксического анализатора "my_search_analyzer" : { "tokenizer" : "whitespace", // Этот анализатор будет использовать фильтр синонимов при анализе фраз "filter" : ["standard", "asciifolding", "lowercase", "kstem", "search_synonym"] } }, // Описываем конфигурацию фильтра-синонима "filter" : { "search_synonym" : { "ignore_case" : "true", "type" : "synonym", "synonyms" : ["aaaa , bbb, ccc"] } } } } }, // Настраиваем индекс "mappings": { // название типа данных, на который это будет распространяться. "mydoc_data": { "properties": { // настройка полей вышеуказанного типа данных которы будут использовать my_search_analyzer при поиске "mydocName": { "type": "string", "index_analyzer": "standard", "search_analyzer": "my_search_analyzer" }, // аналогично вышеуказанному "mydocSecondName": { "type": "string", "index_analyzer": "standard", "search_analyzer": "my_search_analyzer" } } } } }
3. После оновления конфигурации индекса его необходимо сделать доступным для использования командой:
сurl -XPOST 'http://localhost:9200/test_direct/_open'
4. Убедиться что все сделано правильно можно командой
curl -XGET 'http://localhost:9200/test_direct/_analyze/?analyzer=my_search_analyzer&text=aaa'
В ответ должна быть выдана строка:
{ "tokens":[ { "token":"aaa", "start_offset":0, "end_offset":4, "type":"SYNONYM", "position":1 }, { "token":"bbb", "start_offset":0, "end_offset":4, "type":"SYNONYM", "position":1 }, { "token":"ccc", "start_offset":0, "end_offset":4, "type":"SYNONYM", "position":1 } ] }
говорящая, что при поиске фразы aaa также будет искаться bbb и ccc
Литература
1. https://gist.github.com/clintongormley/4095280
2. http://bitsandbites.me/blog/2014/04/08/elasticsearch-synonyms/