我正在尝试为德国电子商务网站实施产品搜索,并且很难找到有关特定问题的正确资源。
我遇到的问题是,搜索部分字词不会返回可行的结果,例如匹配etikett
不会导致包含Rolletiketten
的文档。
Ngrams引入了太多问题,所以经过一些测试我再次摆脱它们。我发现了德语的单词分解并尝试了一些插件。现在我得到了太多完全不相关的结果,例如搜索rolletikett
会返回包含möbelrollen
的文档,这是完全不同的内容。
虽然我了解大多数机制以及为什么我会得到这些结果,但我不知道如何解决我的问题,因为我似乎无法在网上找到合适的资源来清理云。
一些提示会很棒。谢谢。
答案 0 :(得分:0)
使用elasticsearch,你应该得到你开箱即用的东西(例如通过通配符搜索)。 也许你正在做一个只搜索整个单词的布尔查询。
我建议通过查询语言的以下链接:
详细信息:https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html
希望有所帮助,基督徒
提示:您提交的文档映射和确切查询将有助于其他人帮助解决您的问题。
答案 1 :(得分:0)
当你说引入ngrams导致问题时,我认为你可能最终对索引施加了太大的压力。更改最小和最大克数值可以帮助实现这一目标。 例如,下面是我正在使用并且表现良好的分析过滤器:
"autocomplete": {
"type": "edgeNGram",
"min_gram": "1",
"max_gram": "10"
}
这是堆栈溢出的另一个问题,问题陈述不同,但解决方案也与此问题相关:https://stackoverflow.com/a/42592722/3133937
答案 2 :(得分:0)
“现在我得到了太多完全不相关的结果”
尝试使用 min_score
:docs
您的某些 ES 查询可能足够广泛,以至于质量不佳的命中会进入您的结果。只需为分数设置一个阈值就可以帮助他们远离。对我来说,我有很强的 10 分命中率,然后还有大量的 0 分命中率;不需要的。如果您看到这一点,我猜您的查询可能会更有效,但至少 min_score
可以保持绒毛。
GET /myIndex/_search
{
"from" : 0,
"size" : 10,
"min_score": 1,
"query" : {
"match": {
"Title": {
"query": "Bake a Cake",
"fuzziness": 2
}
}
}
}
}