Эластичный поиск: запуск нескольких анализаторов для одних и тех же данных

Я ищу способ заставить ES искать данные с помощью нескольких анализаторов. Анализатор NGram и один или несколько анализаторов языка.

Возможным решением будет использование нескольких полей и явное объявление, какой анализатор использовать для каждого поля.

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

  "mappings": {
    "my_entity": {
      "properties": {
        "my_field": {
          "type": "text",
          "fields": {
            "ngram": {
              "type": "string",
              "analyzer": "ngram_analyzer"
            },
            "spanish": {
              "type": "string",
              "analyzer": "spanish"
            },
            "english": {
              "type": "string",
              "analyzer": "english"
            }
          }
        }
      }
    }
  }

Проблема в том, что я явно записал каждое поле и его анализаторы в поисковый запрос. И это не позволит осуществлять поиск с помощью "_all" и использовать несколько анализаторов.

Есть ли способ заставить "_all" запрос использовать несколько анализаторов? Что-то вроде "_all.ngram", "_all.spanish" и без использования copy_to дублировать данные?

Можно ли объединить анализатор ngram с испанским (или любым другим иностранным языком) и создать один специальный анализатор? Я проверил следующие настройки, но они не работали:

    PUT /ngrams_index
    {
       "settings": {
          "number_of_shards": 1,
          "analysis": {
            "tokenizer": {
              "ngram_tokenizer": {
                 "type": "nGram",
                 "min_gram": 3,
                 "max_gram": 3
              }
            },
            "filter": {
                "ngram_filter": {
                   "type": "nGram",
                   "min_gram": 3,
                   "max_gram": 3
              },

              "spanish_stop": {
                "type":       "stop",
                "stopwords":  "_spanish_" 
              },
              "spanish_keywords": {
                "type":       "keyword_marker",
                "keywords":   ["ejemplo"] 
              },
              "spanish_stemmer": {
                "type":       "stemmer",
                "language":   "light_spanish"
              }


            },
            "analyzer": {
              "ngram_analyzer": {
                 "type": "custom",
                 "tokenizer": "ngram_tokenizer",
                 "filter": [
                    "lowercase",
                    "spanish_stop",
                    "spanish_keywords",
                    "spanish_stemmer"
                 ]
              }
            }
          }
       },
       "mappings": {
          "my_entity": {
            "_all": {
                    "enabled": true,
                    "analyzer": "ngram_analyzer"
             },

             "properties": {
                "my_field": {
                    "type": "text",
                    "fields": {
                          "analyzer1": {
                            "type": "string",
                            "analyzer": "ngram_analyzer"
                          },
                          "analyzer2": {
                                  "type": "string",
                                 "analyzer": "spanish"
                          },
                          "analyzer3": {
                                  "type": "string",
                                 "analyzer": "english"
                          }
                    }
                }
             }
          }
       }
    }



    GET /ngrams_index/_analyze
    {
      "field": "_all",   
      "text": "Hola, me llamo Juan."
    }

возвращает: только результаты Ngram, без испанского анализа

где

    GET /ngrams_index/_analyze
    {
      "field": "my_field.analyzer2",   
      "text": "Hola, me llamo Juan."
    }

правильно анализирует строку поиска.

Можно ли построить собственный анализатор, который бы совмещал испанский и ngram?

1 ответ

Решение

Существует способ создать собственный анализатор языка ngram+:

PUT /ngrams_index
{
  "settings": {
    "number_of_shards": 1,
    "analysis": {
      "filter": {
        "ngram_filter": {
          "type": "nGram",
          "min_gram": 3,
          "max_gram": 3
        },
        "spanish_stop": {
          "type": "stop",
          "stopwords": "_spanish_"
        },
        "spanish_keywords": {
          "type": "keyword_marker",
          "keywords": [
            "ejemplo"
          ]
        },
        "spanish_stemmer": {
          "type": "stemmer",
          "language": "light_spanish"
        }
      },
      "analyzer": {
        "ngram_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [
            "lowercase",
            "spanish_stop",
            "spanish_keywords",
            "spanish_stemmer",
            "ngram_filter"
          ]
        }
      }
    }
  },
  "mappings": {
    "my_entity": {
      "_all": {
        "enabled": true,
        "analyzer": "ngram_analyzer"
      },

      "properties": {
        "my_field": {
          "type": "text",
          "analyzer": "ngram_analyzer"
        }
      }
    }
  }
}


GET /ngrams_index/_analyze
{
  "field": "my_field",
  "text": "Hola, me llamo Juan."
}
Другие вопросы по тегам