【问题标题】:Phrase suggester returns unexpected result when first letter is misspelled当第一个字母拼写错误时,短语建议器返回意外结果
【发布时间】:2018-11-30 11:23:44
【问题描述】:

我正在使用 Elasticsearch Phrase Suggester 来纠正用户的拼写错误。除非用户输入第一个字母拼写错误的查询,否则一切都按我的预期工作。在这种情况下,短语建议器不返回任何内容或返回意外结果。

我的建议查询:

{
"suggest": {
"text": "user_query",
"simple_phrase": {
  "phrase": {
    "field": "title.phrase",,
    "collate": {
      "query": { 
        "inlile" : {
          "bool": {
            "should": [
                 { "match": {"title": "{{suggestion}}"}},
                  { "match": {"participants": "{{suggestion}}"}}
            ]
          }
        }
      }
    }
  }
}

} }

首字母拼写错误示例:

"simple_phrase" : [
  {
    "text" : "گاشانچی",
    "offset" : 0,
    "length" : 11,
    "options" : [ {
      "text" : "گارانتی",
      "score" : 0.00253151
    }]
  }
]

第五个字母拼写错误的例子:

"simple_phrase" : [
  {
    "text" : "کاشاوچی",
    "offset" : 0,
    "length" : 11,
    "options" : [ {
      "text" : "کاشانچی",
      "score" : 0.1121
    },
    {
      "text" : "کاشانجی",
      "score" : 0.0021
    },
    {
      "text" : "کاشنچی",
      "score" : 0.0020
    }]
  }
]

我希望这两个拼写错误的查询有相同的建议(我的预期建议是第二个)。怎么了?

P.S:我正在将此功能用于波斯语。

【问题讨论】:

标签: elasticsearch solr lucene information-retrieval


【解决方案1】:

我有你的问题的解决方案,只需要在你的架构中添加一些字段。

P.S:我在 elasticsearch 方面没有太多专业知识,但我已经使用 solr 解决了同样的问题,你也可以在 elasticSearch 中实现同样的方法

创建新的 ngram 字段并将所有标题名称复制到 ngram 字段中。

当您对拼写错误的单词进行任何查询并且得到空白结果然后拆分 这个词并再次触发相同的查询,您将获得预期的结果。

Example : Suppose user searching for word Akshay but type it as Skshay, then 
create query in below way you will get results as expected hopefully.

I am here giving you solr example same way you can achieve it using 
elasticsearch.

**(ngram:"skshay" OR ngram:"sk" OR  ngram:"ks" OR ngram:"sh" OR ngram:"ha" ngram:"ay")**

我们已经拆分了单词序列,并在字段 ngram 上触发查询。

希望对你有所帮助。

【讨论】:

  • 感谢您的回答,但我想知道为什么这没有按预期工作?据我所知,Phrase Suggester 使用编辑距离来纠正拼写错误的单词,那么如果第一个字母拼写错误,为什么它不起作用?据我所知,在编辑距离算法中哪个字母拼写错误没有区别。
【解决方案2】:

来自 Elasticsearch 文档: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-suggesters-phrase.html

前缀长度

必须匹配的最小前缀字符数才能成为 候选人建议。默认为 1。增加这个数字可以提高 拼写检查性能。通常不会出现拼写错误 条款的开始。 (旧名称“prefix_len”已弃用)

所以默认的短语建议假定第一个字符是正确的,因为prefix_length 的默认值为 1。

注意:将此值设置为 0 不是一个好方法,因为这会影响性能。 您需要使用reverse analyzer 我在这篇文章中解释了它,所以请去检查我的答案 Elasticsearch spell check suggestions even if first letter missed

关于重复项,您可以使用

skip_duplicates 是否应过滤掉重复的建议(默认为 假)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    相关资源
    最近更新 更多