我计划通过在弹性搜索中将每个搜索文本索引为文档来维护用户的搜索历史记录 . 我想到使用前缀查询来获取用户的建议列表 . 除了前缀查询,我还使用Multimatch查询来获取在文本中间匹配的术语 .
伪查询如下所示:
{
"query" : {
bool : {
should : {
"Prefix query"{
}
"multimatch query"{
}
}
}
}
}
在此之前,我想知道使用前缀查询对sugestions有多好 .
我每天都维护一个索引,并想查询过去30天的历史记录 .
这会是性能问题吗?我希望在开始实现它之前清除它 . 在这种情况下是否有任何替代前缀查询 .
I have already implemented suggestions with Completion suggester 但我的要求是根据历史记录和 matching the terms in the middle of the text 的支持向用户提供建议 .
2 回答
在我之前的项目中,我们使用了查询语言,它严重依赖于像这样的运算符 star | part-of-term | star ,我可以说在一些糟糕的情况下(大指数--100万个文档,要分析的大文本,复杂的术语,多种语言) - Lucene表现得很慢(基本上,因为领先的明星在标准的Lucene实现中很重,而且,他们被禁止) . 所有这些都是在没有 MultiMatchQuery 的情况下实施的 .
可以想象,实现像后缀数组(https://en.wikipedia.org/wiki/Suffix_array)这样的改进会有所帮助(至少它对我们有帮助)
所以,结论,要小心,如果你的指数(因为它只有30天的历史)相对较小,你应该没事 .
通常Elasticsearch在搜索方面做得很好 . 在复杂的嵌套聚合查询中,它可能会更慢,但简单的搜索速度非常快 . 我认为你不必提前担心太多 .