带elasticsearch的productsearch

8cdiaqws  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(217)

我对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" } }
      ]
    }
  }
}

这听起来是个好办法吗?或者有人看到更好的方法了吗?
感谢您的帮助!
非常感谢并致以最诚挚的问候,
斯特凡

wgx48brx

wgx48brx1#

为了消除用户的打字错误,您使用 ngram 这是一个昂贵的分析仪。你可以用 stem analyzer提供了一些灵活的选项来消除输入错误
根据我的担心,你可以把它作为一个单独的字段来索引,而不是在两个不同的字段中索引。
例如:-“字段名称”:“samsung | ps-50q7hx” Brand name 以及 Product name 我用了一些分隔符 | . 使用分隔符分析此字段值。因此,您的内容数据将索引如下
三星
ps-50q7hx型
然后您可以通过以下查询进行搜索

{
    "query": {
        "query-string": {
            "query": "Samsung PS-50Q7HX",
            "default_operator": "or",
            "fields": [
                "FIELD_NAME"
            ]
        }
    }
}

这将检索商标名为的文档 samsung 或产品名称 PS-50Q7Hx 从索引。你可以用 prefix 搜索,如果你使用 default_operator 作为 and 那么你的搜索将是最准确的。

相关问题