我正在使用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:我正在将此功能用于波斯语。
答案 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 是否应过滤掉重复的建议(默认为 错误)。