#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" ]
}
}
}
}