asticsearch - использовать поиск во множественном числе по ключевым словам с типом данных - PullRequest
0 голосов
/ 30 января 2020

Я использую анализатор снежного кома с текстовым полем, и в этом поле хранятся ключевые слова продукта, и я использую это поле для поиска документов из индекса. У меня проблема с определением соответствия 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 не будет работать с текстовым типом данных, а также я хочу использовать функции единственного и множественного числа с типом снежного кома.

Есть ли какое-либо решение для этого? Кто-нибудь может помочь решить эту проблему?

...