我们的目标
我们希望给予用户在输入时获得搜索建议的能力,但是ElasticSearch建议器没有提供任何与我们从文章中获取文本片段建议的用例相匹配的内容。对于标题具有很大变化的索引来说,Ngramming和搜索文档标题是可以的,但对于少量文章来说,标题代表的信息量不足,并且许多搜索短语返回零结果。我们也不能让用户使用相关提示线索标记所有文档。
我们的文档通常包括标题、描述(正文)以及各种其他属性,如组、类别和部门。
我们目前的解决方案:单独索引中的Shingles
每次索引文档时,我们调用elasticsearch的_analyze端点为文档的描述+标题生成shingles(2-5)。然后将每个结果(shingles会产生大量结果)存储为一个名为“Suggestion”的字段,存储在原始文档的副本中的新索引中。这是因为一些用户可能希望缩小属于某个类别或任何其他任意过滤的文档建议的范围,我们提供了该选项。
原始文件(主索引):
建议文档(建议索引)
但是,正如您所见,对于一篇1000字的文章,我们很容易得到数百甚至数千个瓦片,每个瓦片都会复制整个主文档。
为了进行搜索,我们在建议文档中进行前缀搜索,并使用术语聚合来获取出现最频繁的单词组合,我们的用户实际上有点喜欢这种解决方案,只要他们没有更好的选择。
我们希望给予用户在输入时获得搜索建议的能力,但是ElasticSearch建议器没有提供任何与我们从文章中获取文本片段建议的用例相匹配的内容。对于标题具有很大变化的索引来说,Ngramming和搜索文档标题是可以的,但对于少量文章来说,标题代表的信息量不足,并且许多搜索短语返回零结果。我们也不能让用户使用相关提示线索标记所有文档。
我们的文档通常包括标题、描述(正文)以及各种其他属性,如组、类别和部门。
我们目前的解决方案:单独索引中的Shingles
每次索引文档时,我们调用elasticsearch的_analyze端点为文档的描述+标题生成shingles(2-5)。然后将每个结果(shingles会产生大量结果)存储为一个名为“Suggestion”的字段,存储在原始文档的副本中的新索引中。这是因为一些用户可能希望缩小属于某个类别或任何其他任意过滤的文档建议的范围,我们提供了该选项。
原始文件(主索引):
{
"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字的文章,我们很容易得到数百甚至数千个瓦片,每个瓦片都会复制整个主文档。
为了进行搜索,我们在建议文档中进行前缀搜索,并使用术语聚合来获取出现最频繁的单词组合,我们的用户实际上有点喜欢这种解决方案,只要他们没有更好的选择。
另一种更简单但速度过慢的解决方案
我们尝试了使用shingles分析器仅分析copy_to字段(自动完成),然后使用包含正则表达式过滤器的terms聚合来删除不以搜索短语开头的术语,但是由于每个字段的不相关术语数量太大,这样做会非常缓慢且占用内存。
搜索:“fabulo”
{
"size": 0,
"aggs": {
"autocomplete": {
"terms": {
"field": "autocomplete",
"include": {
"pattern": "fabulo(.*)"
}
}
}
},
"query": {
"prefix": {
"autocomplete": {
"value": "fabulo"
}
}
}
}
基于之前的搜索建议
我们正在研究如何基于之前的搜索短语提供建议,但是如果新用户没有太多的用户生成的搜索,他们还需要一些基于内容的自动完成建议。
问题:
有没有更快、更简单、更好的方法呢?
ElasticSearch的suggesters似乎都需要您提前知道建议或具有描述性标题。对于大量文本内容的建议来说,这似乎很适用于产品建议,但是我们还需要考虑过滤问题。