Настройка нескольких пользовательских анализаторов на одно поле в elasticsearch

Я работаю в среде ElasticSearch, я установил elasticsearch на свой локальный компьютер для версии 5.4.3. Я пытаюсь создать индекс, определив некоторые настройки вместе с сопоставлениями. Ниже приведены мои настройки и сопоставления,

{  
   "settings":{  
      "index":{  
         "analysis":{  
            "analyzer":{  
               "index_analyzer":{  
                  "filter":[  
                     "standard",
                     "lowercase",
                     "asciifolding"
                  ],
                  "tokenizer":"standard"
               },
               "autocomplete":{  
                  "type":"custom",
                  "tokenizer":"standard",
                  "filter":[  
                     "lowercase",
                     "autocomplete_filter"
                  ]
               },
               "search_analyzer":{  
                  "filter":[  
                     "standard",
                     "lowercase",
                     "asciifolding"
                  ],
                  "tokenizer":"standard"
               },
               "sortable":{  
                  "filter":"lowercaseFilter",
                  "tokenizer":"keyword",
                  "type":"custom"
               }
            },
            "filter":{  
               "lowercaseFilter":{  
                  "type":"lowercase"
               },
               "autocomplete_filter":{  
                  "type":"edge_ngram",
                  "min_gram":1,
                  "max_gram":20
               }
            },
            "tokenizer":{  
               "keyword":{  
                  "type":"keyword"
               }
            }
         }
      }
   }
}

это мои сопоставления,

{  
   "geo_data":{  
      "_all":{  
         "enabled":true,
         "index_analyzer":"index_analyzer",
         "search_analyzer":"search_analyzer"
      },
      "properties":{  
         "subscriber_level":{  
            "analyzer":"index_analyzer,search_analyzer,autocomplete_analyzer",
            "type":"text"
         },
         "att_id":{  
            "analyzer":"index_analyzer,search_analyzer,autocomplete_analyzer",
            "type":"text"
         },
         "id":{  
            "include_in_all":false,
            "type":"text"
         },
         "name":{  
            "analyzer":"index_analyzer,search_analyzer,autocomplete_analyzer",
            "type":"text"
         },
         "state_name":{  
            "analyzer":"index_analyzer,search_analyzer,autocomplete_analyzer",
            "type":"text"
         }
      }
   }
}

Чего я хочу добиться, так это применить все пользовательские анализаторы к одному полю. Но приведенные выше сопоставления полей для анализаторов дают следующее исключение:

{  
   "error":{  
      "root_cause":[  
         {  
            "type":"mapper_parsing_exception",
            "reason":"analyzer [index_analyzer,search_analyzer,autocomplete_analyzer] not found for field [subscriber_level]"
         }
      ],
      "type":"mapper_parsing_exception",
      "reason":"analyzer [index_analyzer,search_analyzer,autocomplete_analyzer] not found for field [subscriber_level]"
   },
   "status":400
}

Пожалуйста, кто-нибудь может помочь мне решить эту проблему, борясь с ней.


person Tushar Deshpande    schedule 30.06.2017    source источник


Ответы (1)


вы пытаетесь токенизировать одно и то же поле с помощью нескольких анализаторов. Вы можете использовать несколько полей и применять различные анализатор для каждого типа внутри нескольких полей.

Также после этой ошибки github конфигурация поля _all изменена для версии 5.4. Если ваш проиндексированный уже существует,

PUT some_index/_mappings/type_name
{
            "_all": {
                "enabled": true,
                "type": "text",
                "analyzer": "index_analyzer"
            },
            "properties": {
                "subscriber_level": {
                    "type": "keyword",
                    "fields": {
                        "index_analyzed": {
                            "type": "text",
                            "analyzer": "index_analyzer"
                        },
                        "search_analyzed": {
                            "type": "text",
                            "analyzer": "search_analyzer"
                        },
                        "autocomplete_analyzed": {
                            "type": "text",
                            "analyzer": "autocomplete"
                        }
                    }
                },
                "att_id": {
                    "type": "keyword",
                    "fields": {
                        "index_analyzed": {
                            "type": "text",
                            "analyzer": "index_analyzer"
                        },
                        "search_analyzed": {
                            "type": "text",
                            "analyzer": "search_analyzer"
                        },
                        "autocomplete_analyzed": {
                            "type": "text",
                            "analyzer": "autocomplete"
                        }
                    }
                },
                "id": {
                    "include_in_all": false,
                    "type": "text"
                },
                "name": {
                    "type": "keyword",
                    "fields": {
                        "index_analyzed": {
                            "type": "text",
                            "analyzer": "index_analyzer"
                        },
                        "search_analyzed": {
                            "type": "text",
                            "analyzer": "search_analyzer"
                        },
                        "autocomplete_analyzed": {
                            "type": "text",
                            "analyzer": "autocomplete"
                        }
                    }
                },
                "state_name": {
                    "type": "keyword",
                    "fields": {
                        "index_analyzed": {
                            "type": "text",
                            "analyzer": "index_analyzer"
                        },
                        "search_analyzed": {
                            "type": "text",
                            "analyzer": "search_analyzer"
                        },
                        "autocomplete_analyzed": {
                            "type": "text",
                            "analyzer": "autocomplete"
                        }
                    }
            }
    },
    "settings": {
        "index": {
            "analysis": {
                "analyzer": {
                    "index_analyzer": {
                        "filter": [
                            "standard",
                            "lowercase",
                            "asciifolding"
                        ],
                        "tokenizer": "standard"
                    },
                    "autocomplete": {
                        "type": "custom",
                        "tokenizer": "standard",
                        "filter": [
                            "lowercase",
                            "autocomplete_filter"
                        ]
                    },
                    "search_analyzer": {
                        "filter": [
                            "standard",
                            "lowercase",
                            "asciifolding"
                        ],
                        "tokenizer": "standard"
                    },
                    "sortable": {
                        "filter": "lowercaseFilter",
                        "tokenizer": "keyword",
                        "type": "custom"
                    }
                },
                "filter": {
                    "lowercaseFilter": {
                        "type": "lowercase"
                    },
                    "autocomplete_filter": {
                        "type": "edge_ngram",
                        "min_gram": 1,
                        "max_gram": 20
                    }
                },
                "tokenizer": {
                    "keyword": {
                        "type": "keyword"
                    }
                }
            }
        }
    }
}

Теперь вы используете любое проанализированное поле для запроса, например, следующее

POST some_index/_search
{
  "query": {
    "term": {
      "state_name.index_analyzed": {
        "value": "VALUE"
      }
    }
  }
}

Спасибо

person user3775217    schedule 30.06.2017
comment
Спасибо @users3775217, это сработало для моего сценария. Большое спасибо. У меня есть одно сомнение относительно ES, я новичок в этом мире ES, но во время изучения я заметил, что в Интернете доступно ограниченное количество объяснений и примеров, даже в stackoverflow ограниченное количество пользователей знает об ES, как вы, даже я также узнайте об ES только потому, что этого хочет наш клиент, я имею в виду, что мы не можем найти прямого примера для этого для нового пользователя, почему это так? Это предстоящий новый фреймворк на рынке или старый. Извините, если вопрос базовый, у меня просто есть сомнения. - person Tushar Deshpande; 01.07.2017
comment
у них есть хорошие примеры для объяснения всех необходимых концепций и частей. да, я согласен, как вы их используете важно. как всегда, стек и гитхаб — хорошие места для поиска проблем. - person user3775217; 01.07.2017