Можно ли задать для "fuzzy_transpositions" значение "false" в запросе "multi_match" вasticsearch? - PullRequest
0 голосов
/ 11 апреля 2019

Я искал, но не уверен, можно ли отключить "fuzzy_transpositions" в запросе "multi_match" при использовании "нечеткости".

При поиске я вижу совпадение с "cam"для «игр», использующих «нечеткость» в качестве 1.

Я попытался установить «fuzzy_transpositions» как ложное, но все равно получило совпадение.Это мой код.

{
    function_score: {
        query: {
            bool: {
                must: [
                    [{
                        match: {
                            _id: 7676
                        }
                    }, {
                        term: {
                            store_codes: "de"
                        }
                    }], {
                        bool: {
                            should: [{
                                multi_match: {
                                    fields: ["frontname.*"],
                                    query: "games"
                                }
                            }, {
                                multi_match: {
                                    fields: ["frontname.*"],
                                    query: "games",
                                    fuzziness: "1",
                                    fuzzy_transpositions: false
                                }
                            }],
                            minimum_should_match: 1
                        }
                    }
                ]
            }
        },
        functions: [{
            gauss: {
                rank: {
                    origin: 200,
                    scale: 100
                }
            }
        }],
        score_mode: "sum"
    }
}

1 Ответ

0 голосов
/ 12 апреля 2019

Нечеткое преобразование не имеет ничего общего с тем, что у вас есть. Это не относится к вашему сценарию. Как упомянуто в ссылке, он решает сценарий, в котором, если ваш запрос ab, он вернет транспонированных результатов, т.е. ba.

Я попробовал сценарий, который вы упомянули, и, насколько я понимаю, вы можете использовать Ngram или Edge Ngram токенайзер для своих полей.

Как упомянуто в ссылке Edge Ngram, допустим, у нас есть следующее отображение:

PUT my_fuzzy_index
{  
   "mappings":{  
      "mydocs":{  
         "properties":{  
            "title":{  
               "type":"text",
               "analyzer":"my_analyzer"
            },
            "desc":{  
               "type":"text",
               "analyzer":"my_analyzer"
            }
         }
      }
   },
   "settings":{  
      "analysis":{  
         "analyzer":{  
            "my_analyzer":{  
               "tokenizer":"my_tokenizer"
            }
         },
         "tokenizer":{  
            "my_tokenizer":{  
               "type":"edge_ngram",
               "min_gram":2,
               "max_gram":5,
               "token_chars":[  
                  "letter",
                  "digit"
               ]
            }
         }
      }
   }
}

Давайте выполним следующий Анализ запроса сейчас:

POST my_fuzzy_index/_analyze
{
  "analyzer": "my_analyzer", 
  "text": "games"
}

Когда вы сделаете это, вы увидите, что в ответе будут созданы следующие токены. Это означает, что ваш инвертированный индекс будет иметь следующие слова.

ga, gam, game, games

Теперь, если вы выполняете поиск с помощью fuzziness: 1, он фактически применяет тот же самый анализатор во время запроса, что означает, что он также будет возвращать результаты вышеупомянутых токенов и его нечетких братьев и сестер, имеющих правку расстояние 1 (gam и с расстоянием редактирования 1, также будет возвращено cam).

То, что вы могли бы использовать, используйте standard analyzer в своем поисковом запросе, как показано ниже, однако обратите внимание, что нечеткость все еще применяется, например. он вернет результаты со словом james, если ваш запрос games, так как fuzziness установлен на 1, но он покончит с поиском слов, длина которых меньше n-1 вашего запроса .

POST my_fuzzy_index/_search
{
  "query": {
    "multi_match": {
      "query": "games",
      "fields": ["*"],
      "fuzziness": 1,
      "analyzer": "standard"            <---- this field here
    }
  }
}

И если то, что вы ищете, это вернуть похожие результаты, например, как game, games, gaming, тогда пропустите понятие нечеткого поиска и используйте понятие Stemmer .

Весь смысл использования нечеткости состоит в том, чтобы показать вам некоторые нетрадиционные результаты, например, управлять орфографическими ошибками, искать на основе имен пользователей / кодов продуктов и т. д. Таким образом, в основном то, что вы наблюдаете, работает правильно в соответствии с определением нечеткости. Эта ссылка должна помочь вам лучше понять нечеткость.

Надеюсь, это поможет!

...