我们的目标
我们希望使我们的用户能够在开始键入时获得搜索建议,但是ElasticSearch建议者没有提供任何适合我们从文章中获取文本摘要建议的用例。对具有大量变化很大的标题的索引进行Ngramming和搜索文档标题是很好的,但是对于少数文章,标题只是不能代表足够的信息,并且很多搜索短语将返回零结果。我们也不能让用户使用相关建议线索标记所有文档。
我们的文档通常包括标题和说明(正文),以及其他各种属性,例如组,类别和部门。
我们当前的解决方案:在单独的索引中带状
每次我们为文档建立索引时,我们都将调用elasticsearch _analyze端点以生成用于文档描述和标题的瓦片(2-5)。然后,每个结果(带状疱疹会产生大量结果)都存储为一个名为“建议”的字段,并存储在新索引的原始文档的副本中。这是因为某些用户可能希望缩小对属于特定类别的文档的建议,或者我们可以选择提供的任何其他任意过滤器。
原始文档(主索引):
{
"Title": "A fabulous document",
"Description": "A document with fabulous content"
"Category": "A"
}
建议文件(建议索引)
(Suggestion 1)
{
"Title": "A fabulous document",
"Description": "A document with fabulous content",
"Category": "A"
"Suggestion": "A"
}
(Suggestion 2)
{
"Title": "A fabulous document",
"Description": "A document with fabulous content",
"Category": "A"
"Suggestion": "A document"
}
...
(Suggestion N)
{
"Title": "A fabulous document",
"Description": "A document with fabulous content",
"Category": "A"
"Suggestion": "a document with"
}
但是,正如您所看到的,对于一篇1000字的文章,我们可以轻松获得成百上千的带状疱疹,每个带状疱疹都复制了整个主文档。
要搜索,我们在建议文档中进行前缀搜索并进行术语汇总,以获取出现频率最高的单词组合,并且我们的用户只要没有更好的条件,实际上就喜欢此解决方案。
另一个更简单但太慢的解决方案
我们试图使用带状疱疹分析器来分析copy_to字段(自动完成),然后使用正则表达式include-filter进行术语聚合以删除并非以搜索词开头的术语,但这太慢了和内存不足,因为每个字段的无关术语(针对特定查询)的数量太多了。
搜索:“fabulo”
{
"size": 0,
"aggs": {
"autocomplete": {
"terms": {
"field": "autocomplete",
"include": {
"pattern": "fabulo(.*)"
}
}
}
},
"query": {
"prefix": {
"autocomplete": {
"value": "fabulo"
}
}
}
}
基于先前搜索的建议
我们正在根据先前的搜索词组提供建议,但是如果新用户只有很少的用户生成搜索内容,则他们还需要根据内容提供一些自动完成建议。
问题:
有什么方法可以更快,更简单,更好地做到这一点?
ElasticSearch suggesters似乎都要求您事先了解建议或具有描述性的标题。似乎对产品建议非常有用,但对较大的文本内容建议却不太好。另外,我们要考虑过滤问题。
最佳答案
我们正在使用带状疱疹和聚合的组合成专用索引:
"type": "shingle",
"max_shingle_size": 3,
"min_shigle_size": 1
},