Я хочу создать запрос с использованием ElasticSearch Java API, который соответствует только (1) полным словам и (2) всем словам из поискового запроса. Вот пример для этого:
Текст:
hello wonderful world
Они должны соответствовать:
hello
hello wonderful
hello world
wonderful world
hello wonderful world
wonderful
world
Они не должны совпадать:
hell
hello fniefsgbsugbs
Я попробовал следующие параметры для запроса на сопоставление, но он по-прежнему соответствует двум приведенным выше примерам.
Это код для генерации запроса с использованием ElasticSearch 7.7.1 Java API:
import org.elasticsearch.index.query.QueryBuilders
...
QueryBuilders.matchQuery(field, query)
.autoGenerateSynonymsPhraseQuery(false)
.fuzziness(0)
.prefixLength(0)
.fuzzyTranspositions(false)
.operator(Operator.AND)
.minimumShouldMatch("100%")
Что сгенерирует этот запрос:
{
"size": 100,
"query": {
"bool": {
"filter": [
{
"match": {
"searchableText": {
"query": "hell",
"operator": "AND",
"fuzziness": "0",
"prefix_length": 0,
"max_expansions": 50,
"minimum_should_match": "100%",
"fuzzy_transpositions": false,
"lenient": false,
"zero_terms_query": "NONE",
"auto_generate_synonyms_phrase_query": false,
"boost": 1
}
}
}
]
}
}
}
Может ли кто-нибудь помочь мне найти хорошее решение для этого?
Редактировать: вот настройки и сопоставления (я удалил все, что не относится к searchableText
, чтобы сделать его как можно меньше):
{
"settings": {
"analysis": {
"normalizer": {
"lowercase_normalizer": {
"type": "custom",
"filter": [
"lowercase"
]
}
},
"filter": {
"german_stemmer": {
"type": "stemmer",
"language": "light_german"
},
"ngram_filter": {
"type": "shingle",
"max_shingle_size": 4,
"min_shingle_size": 2,
"output_unigrams": false,
"output_unigrams_if_no_shingles": false
}
},
"analyzer": {
"german": {
"tokenizer": "standard",
"filter": [
"lowercase",
"german_synonyms",
"german_stop",
"german_keywords",
"german_no_stemming",
"german_stemmer"
]
},
"german_ngram": {
"tokenizer": "standard",
"filter": [
"lowercase",
"german_synonyms",
"german_keywords",
"german_no_stemming",
"german_stemmer",
"ngram_filter"
]
}
}
}
},
"mappings": {
"properties": {
"description": {
"type": "text",
"copy_to": "searchableText",
"analyzer": "german"
},
"name": {
"type": "text",
"copy_to": "searchableText",
"analyzer": "german"
},
"userTags": {
"type": "keyword",
"copy_to": "searchableText",
"normalizer": "lowercase_normalizer"
},
"searchableText": {
"type": "text",
"analyzer": "german",
"fields": {
"ngram": {
"type": "text",
"analyzer": "german_ngram"
}
}
},
"searches": {
"type": "keyword",
"copy_to": "searchableText",
"normalizer": "lowercase_normalizer"
}
}
}
}
Изменить 2. Это упомянутые фильтры:
"filter": {
"german_stop": {
"type": "stop",
"stopwords": "_german_"
},
"german_stemmer": {
"type": "stemmer",
"language": "light_german"
},
"ngram_filter": {
"type": "shingle",
"max_shingle_size": 4,
"min_shingle_size": 2,
"output_unigrams": false,
"output_unigrams_if_no_shingles": false
}
}
searchableText
, а также любые связанные с ним настройки. - person Nishant   schedule 18.11.2020