一尘不染

完成提示符的标记字符串

elasticsearch

想要使用完成建议程序构建电子商务网站的自动完成功能。

这是我的索引:

PUT myIndex
{
    "mappings": {
        "_doc" : {
            "properties" : {
                "suggest" : {
                    "type" : "completion"
                },
                "title" : {
                    "type": "keyword"
                }, 
                "category" : { 
                    "type": "keyword"
                },
                "description" : { 
                    "type": "keyword"
                }
            }
        }
    }
}

现在,当上传广告时,我希望标题字段用于自动完成,因此这就是我上传文档的方式:

POST dummy/_doc
{
  "title": "Blue asics running shoes",
  "category": "sports",
  "description": "Nice blue running shoes, size 44 eu",
  "suggest": {
    "input": "Blue Asics running shoes" // <-- use title
  }
}

问题是,通过这种方式,elasticsearch仅从开始就匹配字符串…即“ Blu”将找到结果,但“ Asic”或“ Run”或“ Sho”将不返回任何内容…

所以我需要做的是像这样标记我的输入:

POST dummy/_doc
{
  "title": "Blue asics running shoes",
  "category": "sports",
  "description": "Nice blue running shoes, size 44 eu",
  "suggest": {
    "input": ["Blue", "Asics", "running", "shoes"] // <-- tokenized title
  }
}

这会很好…但是我应该如何标记我的字段?我知道我可以在c#中拆分字符串,但是无论如何,我可以在Elasticsearch / Nest中做到这一点吗?


阅读 184

收藏
2020-06-22

共1个答案

一尘不染

完成提示器设计用于使用分析器(而不是数据类型默认的分析器)快速按需搜索 前缀
查询。simple``standard``text

如果您需要标题中 所有 标记上的部分前缀匹配,而不仅仅是标题的开头,那么您可能需要考虑采用以下方法之一:

  1. 使用分析API与分析,将令牌化标题为令牌/条款从中你会想部分前缀匹配,而指数这个集合作为inputcompletion领域。标准分析仪可能是一个很好的起点。

请记住,用于完成提示的数据结构在使用时会保存在内存中,因此文档中的高级基数会增加此数据结构的内存需求。还应考虑到匹配项的“计分”很简单,因为它是由应用于每个输入的权重控制的。

要么

  1. 请勿在此处使用“完成建议程序”,而应将字段设置titletext具有多个字段的数据类型,这些字段包括title应分析(或不分析,keyword例如,使用子字段)的不同方式。

花一些时间使用Analyze
API来构建一个分析器,该分析器允许在标题中任何位置使用部分术语前缀。首先,诸如标准令牌生成器,小写令牌过滤器,Edgengram令牌过滤器以及可能的Stop令牌过滤器之类的工具将使您运行起来。还要注意,您希望搜索分析器执行与索引分析器类似的操作, Edgengram令牌过滤器 除外
,因为无需对搜索输入中的令牌进行ngramming。

2020-06-22