Я использую анализатор снежного кома с текстовым полем, и в этом поле хранятся ключевые слова продукта, и я использую это поле для поиска документов из индекса. У меня проблема с определением соответствия c ключевых слов с несколькими словами. и выдает мне неправильный вывод.
Мой запрос на удар.
{
"bool": {
"should": [
{
"match": {
"search_singular_plural": {
"query": "'.$keyword.'",
"operator": "and",
"fuzziness": 1,
"prefix_length": 2
}
}
}
]
}
}
Отображение документа для поля search_singular_plural
curl -X PUT "http://localhost:9200/products?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"analysis": {
"filter": {},
"analyzer": {
"keyword_analyzer": {
"filter": [
"lowercase",
"asciifolding",
"trim"
],
"char_filter": [],
"type": "custom",
"tokenizer": "keyword"
},
"edge_ngram_analyzer": {
"filter": [
"lowercase"
],
"tokenizer": "edge_ngram_tokenizer"
},
"edge_ngram_search_analyzer": {
"tokenizer": "lowercase"
},
"singular_plural_analyzer": {
"type": "snowball"
}
},
"tokenizer": {
"edge_ngram_tokenizer": {
"type": "edge_ngram",
"min_gram": 2,
"max_gram": 5,
"token_chars": [
"letter"
]
}
}
}
}
},
"mappings": {
"search_singular_plural": {
"type": "text",
"fields": {
"completion": {
"type": "completion",
"analyzer": "simple",
"preserve_separators": true,
"preserve_position_increments": true,
"max_input_length": 50
},
"edgengram": {
"type": "text",
"analyzer": "edge_ngram_analyzer",
"search_analyzer": "edge_ngram_search_analyzer"
},
"keywordstring": {
"type": "text",
"analyzer": "keyword_analyzer"
}
},
"analyzer": "singular_plural_analyzer"
}
}
}
'
и search_singular_plural поле хранится в виде массива, как показано ниже
_source: {
"search_singular_plural": [decorative,decor,fancy,elegant,decorated,light,lighting,light source,lamp,lamps,lights,led light,light decorative,decoration,indoor,home,inside,lightning,indoor light,indoor lamp,light for home,lights for home,lamp for home,table,table lamp,table lamps,tablelamp,bedside lamp,bedside lamps,side lamp,side lamps,table light,table lights,tablelight,bedside light,bedside lights,side light,side lights,lamp for table,light for table,lamp on table,light on table]
}
Теперь проблема в том, что я ищу "боковую таблицу " и соответствует приведенному выше результату, поскольку в массиве присутствуют " side " и " table ". Каждое значение, разделенное запятыми, отличается для меня. Таким образом, текущая ситуация не подходит для меня. Я хочу сопоставить, если оба находятся в одном ключе массива. Я знаю, что термин match не будет работать с текстовым типом данных, а также я хочу использовать функции единственного и множественного числа с типом снежного кома.
Есть ли какое-либо решение для этого? Кто-нибудь может помочь решить эту проблему?