短语建议者在首字母拼写错误时返回意外结果

时间:2018-06-21 07:55:51

标签: elasticsearch solr lucene information-retrieval

我正在使用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:我正在将此功能用于波斯语。

2 个答案:

答案 0 :(得分:0)

  

我有解决您问题的方法,只需要在架构中添加一些字段即可。

PS:我在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上进行了查询。

     

希望它会对您有所帮助。

答案 1 :(得分:0)

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

<块引用>

前缀长度

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

因此默认情况下,phrase-suggester 假定第一个字符是正确的,因为 prefix_length 的默认值为 1。

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

对于重复项,您可以使用

<块引用>

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