【发布时间】:2015-05-26 13:59:46
【问题描述】:
我对 elasticsearch 比较陌生,我想搜索具有品牌和类型名称的产品。 我已经尝试了一些,但我认为我缺少一些重要的东西来拥有一个可靠的搜索算法。这是我的方法:
产品看起来像这样:
{
brandName: "Samsung",
typeName: "PS-50Q7HX",
...
}
我将有一个输入字段。用户可以仅搜索品牌/类型或结合类型名称搜索品牌。例如
Samsung | Samsung PS-50Q7HX | PS-50Q7HX
为了消除 typeName 字段中的错误输入,我使用了一个 ngram 标记器,它在我只搜索类型时效果很好。但是结合brandName字段我遇到了麻烦。使用这样的东西效果不好(特别是当我也在品牌名称字段上使用 ngram 标记器时):
{
"query" : {
"multi_match" : {
"query": "Samsung PS 50Q 7HX",
"type": "cross_fields",
"fields": ["brandName", "typeName"]
}
}
}
当然我知道为什么这不适用于两个 ngram 标记器和一个混合字段,但我不知道如何以最好的方式解决这个问题。
我认为主要问题是我不知道用户是否输入了品牌名称,我考虑使用填充所有可用品牌的第二个索引,我用它来执行“预搜索”最终在我的查询字符串中给出了品牌名称。如果我找到匹配项,我可以将搜索字符串拆分为类型和品牌名称并执行更具体的搜索。喜欢这个
{
"query": {
"bool": {
"must": [
{ "match": { "brandName": "Samsung" } },
{ "match": { "typeName": "PS-50Q7HX" } }
]
}
}
}
这听起来是个好方法吗?或者有没有人看到更好的方法?
感谢任何帮助!
非常感谢您的问候,
斯蒂芬
【问题讨论】:
-
“效果不好”是什么意思?你能否展示一些你得到的样本结果以及为什么它们不够好。看来您的品牌和类型具有非常不同的词汇结构,所以我很好奇您已经制作的内容会得到什么样的结果。
-
感谢您的回答。当我对两个字段都使用 ngram 标记器并使用 multi_match 搜索时,例如“Samsung SGH”将是“Hama SGH-D500/Z300 Samsung ...”,但品牌完全错误,因为类型也与品牌匹配。
标签: elasticsearch