在MySQL中,我可以执行以下操作:
SELECT id FROM table WHERE field = 'foo' LIMIT 5
如果表有10,000行,那么该查询的速度要比我省略LIMIT部分的速度快得多。
在ElasticSearch中,我得到以下内容:
{ "query":{ "fuzzy_like_this_field":{ "body":{ "like_text":"REALLY LONG (snip) TEXT HERE", "max_query_terms":1, "min_similarity":0.95, "ignore_tf":true } } } }
当我运行此搜索时,它需要花费几秒钟的时间,而mysql可以在短得多的时间内返回相同查询的结果。
如果传入size参数(设置为1),则它仅成功返回1个结果,但是查询本身并没有比将size设置为unlimited并返回所有结果更快。我怀疑查询正在整体运行,并且查询完成处理后仅返回1个结果。这意味着“大小”属性对我而言毫无用处。
有什么方法可以让我的搜索在找到与模糊搜索匹配的单个记录后立即停止搜索,而不是在返回响应之前处理索引中的每个记录?我是否误解了一些更基本的东西?
提前致谢。
您是正确的查询正在完全运行。默认情况下,查询返回按得分排序的数据,因此您的查询将对每个文档进行得分。文档指出,模糊查询无法很好地扩展,因此可能需要考虑其他查询。
一个限制过滤器可能会给你类似的行为你想找的。
限制筛选器限制要执行的文档数量(每个分片)
要复制mysql,请field='foo'尝试使用术语过滤器。当您不关心评分时,应该使用过滤器,因为它们速度更快且可以缓存。
field='foo'