Хорошая штука 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/