Создавайте и объединяйте индексы с помощью нескольких анализаторов в Elasticsearch

#java #elasticsearch

Вопрос:

Итак, у меня есть два фильтра, определенных в моем файле JSON конфигурации. Теперь я хочу применить эти фильтры по одному, а затем объединить результат.

 "filter": {
      "autocomplete_filter": {
        "type": "edge_ngram",
        "min_gram": 3,
        "max_gram": 20
      },
      "shingle_filter": {
          "type": "shingle",
          "min_shingle_size": 1,
          "max_shingle_size": 2
      }
    },
 

Пример:

 "best mac laptop" -> "best", "mac", "laptop", "best mac", "mac laptop", "bes", "best", "best ", "best m", "best ma", "best mac", ...
 

Как и выше, я хочу создать индекс с помощью фильтра гонта, затем я хочу создать фильтр автозаполнения индекса для исходных данных, а затем объединить и создать индекс в одном документе. Возможно ли это? В любом случае, есть ли?

Ответ №1:

Итак, после тщательного изучения документов spring data Elasticsearch я могу индексировать одно и то же поле с помощью двух разных анализаторов.

 @Document(indexName = "course-doc")
@Setting(settingPath = "es-config/autocomplete.json")
@Getter
@Setter
public class Course {
  @Id
  long id;

  @MultiField(
      mainField = @Field(type = FieldType.Text, analyzer = "autocomplete_index", searchAnalyzer = "autocomplete_search"),
      otherFields = {@InnerField(suffix = "search", type = FieldType.Text, analyzer = "search_index", searchAnalyzer = "autocomplete_search")})
  String name;
}
 

автозаполнение.json

 {
  "analysis": {
    "filter": {
      "autocomplete_filter": {
        "type": "edge_ngram",
        "min_gram": 2,
        "max_gram": 20
      },
      "shingle_filter": {
          "type": "shingle",
          "min_shingle_size": 1,
          "max_shingle_size": 10
      }
    },
    "analyzer": {
      "autocomplete_search": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [ "lowercase" ]
      },
      "autocomplete_index": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [ "lowercase", "stop" , "autocomplete_filter" ]
      },
      "search_index": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [ "lowercase" , "shingle_filter" ]
      },
      "standard-analyzer": {
        "type": "custom",
        "tokenizer": "standard",
        "filter": [ "lowercase", "stop" ]
      }
    }
  }
}