Настройка синонимов в Elasticsearch

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