我对elasticsearch比较陌生,我想搜索带有品牌和类型名称的产品。我已经尝试了一点,但我认为我错过了一些重要的东西,有一个坚实的搜索算法。我的方法是:
产品外观如下:
{
brandName: "Samsung",
typeName: "PS-50Q7HX",
...
}
我将有一个单一的输入字段。用户可以只搜索品牌/类型,也可以搜索与类型名称组合的品牌。例如
Samsung | Samsung PS-50Q7HX | PS-50Q7HX
为了消除typename字段中的错误输入,我使用了一个ngram标记器,当我只搜索类型时,它非常有效。但再加上brandname字段,我就麻烦了。使用这样的方法效果不好(特别是当我在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" } }
]
}
}
}
这听起来是个好办法吗?或者有人看到更好的方法了吗?
感谢您的帮助!
非常感谢并致以最诚挚的问候,
斯特凡
1条答案
按热度按时间wgx48brx1#
为了消除用户的打字错误,您使用
ngram
这是一个昂贵的分析仪。你可以用stem
analyzer提供了一些灵活的选项来消除输入错误根据我的担心,你可以把它作为一个单独的字段来索引,而不是在两个不同的字段中索引。
例如:-“字段名称”:“samsung | ps-50q7hx”
Brand name
以及Product name
我用了一些分隔符|
. 使用分隔符分析此字段值。因此,您的内容数据将索引如下三星
ps-50q7hx型
然后您可以通过以下查询进行搜索
这将检索商标名为的文档
samsung
或产品名称PS-50Q7Hx
从索引。你可以用prefix
搜索,如果你使用default_operator
作为and
那么你的搜索将是最准确的。