Несколько анализаторов для конкретного поля - PullRequest
0 голосов
/ 08 ноября 2018

Я работаю над Elastic Search 6.4.2. Мне нужно применить несколько анализаторов к одному полю. Я ищу применение анализаторов снежного кома и стоп-слов для полей заголовка и контента. Я делюсь своим отображением Это правильный подход для определения анализаторов.

PUT /some-index
{
    "settings": {
        "index": {
            "number_of_shards": 5,
            "number_of_replicas": 1,
            "refresh_interval": "60s",
            "analysis" : {
              "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : ["standard", "lowercase", "my_snow"]
               },
               "stop_analyzer": {
                 "type":       "stop",
                 "stopwords":  "_english_"
               }
              } ,


              "filter" : {
                "my_snow" : {
                    "type" : "snowball",
                    "language" : "Lovins"
                }
            }
        }
        }
    },
    "mappings": {
        "doc": {
            "_source": {
                "enabled": true
            },
            "properties": {
                "content": {
                    "type": "text",
                    "index": "true",
                    "store": true,
                     "analyzer":["my_analyzer","stop_analyzer"],
                     "search_analyzer": ["my_analyzer","stop_analyzer"]
                },

                "title": {
                    "type": "text",
                    "index": "true",
                    "store": true,
                            "analyzer":["my_analyzer","stop_analyzer"],
                            "search_analyzer": ["my_analyzer","stop_analyzer"]

                },
                "url": {
                    "type": "text",
                    "index": "true",
                    "store": true

       }

            }
        }
    }
}

1 Ответ

0 голосов
/ 08 ноября 2018

То, что вы ищете, невозможно. Вы не можете иметь несколько анализаторов в одном поле.

И, учитывая ваши требования, вы можете просто добавить два фильтра, фильтр остановки и снежный ком и добавить их, как показано в разделе Solution 1. Я также упомянул еще два подхода только для вашей информации, однако я считаю, что они не будут иметь большого смысла для вашего варианта использования.

Решение 1. При рассмотрении ваших требований используйте два фильтра (один для снежного кома и другой для стоп-слов)

Mapping

PUT <your_index_name>
{
  "settings": {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "tokenizer" : "standard",
                    "filter" : ["standard", "lowercase", "my_snow", "my_stop"]
                }
            },
            "filter" : {
                "my_snow" : {
                    "type" : "snowball",
                    "language": "English"

                },
                "my_stop": {
                    "type":       "stop",
                    "stopwords":  "_english_"
                }
            }
        }
    },
    "mappings": {
      "doc": {
            "_source": {
                "enabled": true
            },
            "properties": {
                "title": {
                    "type": "text",
                    "index": "true",
                    "store": true,
                    "analyzer": "my_analyzer"
                }
            }
        }
    }
}

Запрос анализа образца

POST <your_index_name>/_analyze
{
  "analyzer": "my_analyzer",
  "text": "This is the thing, perfection is not worth it"
}

Ответ на запрос

{
  "tokens": [
    {
      "token": "thing",
      "start_offset": 12,
      "end_offset": 17,
      "type": "<ALPHANUM>",
      "position": 3
    },
    {
      "token": "perfect",
      "start_offset": 19,
      "end_offset": 29,
      "type": "<ALPHANUM>",
      "position": 4
    },
    {
      "token": "worth",
      "start_offset": 37,
      "end_offset": 42,
      "type": "<ALPHANUM>",
      "position": 7
    }
  ]
}

Решение 2. Использование нескольких полей

Однако, если вы действительно настаиваете на том, чтобы вместо этого вы хотели иметь несколько анализаторов, вы можете создать multi-field и использовать оба анализатора.

Ниже показано, как будет выглядеть ваше отображение в этом случае. Я использую только приведенный ниже пример для поля title, и вы можете применить изменения для других полей. Примечание, приведенное ниже, предназначено только для демонстрации, я бы предложил solution 1 для вашего требования

PUT <your_index_name>
{  
   "settings":{  
      //same as the one you've posted in the question. 
   },
   "mappings":{  
      "doc":{  
         "_source":{  
            "enabled":true
         },
         "properties":{  
            "title":{  
               "type":"text",
               "index":"true",
               "store":true,
               "analyzer":"my_analyzer",
               "fields":{  
                  "withstopwords":{  
                     "type":"text",
                     "analyzer":"stop_analyzer"
                  }
               }
            }
         }
      }
   }
}

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

В основном используйте поле title для my_analyzer и используйте title.stopwords для stop_analyzer.

Решение 3. Несколько индексов, один и тот же псевдоним

Для этого у вас в конечном итоге будет

some_index1:analyzer_type_1
some_index2:analyzer_type_2
Add alias "some_index" for both some_index1 & some_index2
Query using this alias "some_index"

И затем вы можете запросить, используя псевдоним, следующим образом. Обратите внимание, что при запросе с использованием some_index поиск в обоих индексах some_index1 & some_index2 будет внутренним.

POST some_index/_search
{
  "query": {
    "match": {
      "title": "perfection"
    }
  }
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...