如何编写快速弹性搜索查询

时间:2012-10-25 19:04:58

标签: elasticsearch

是否有编写ES查询的指南 - 做什么,要避免什么,这类东西。官方网站描述了所有不同的搜索方式,但对何时选择什么方式几乎没有任何影响。

在我的特定实例中,我有一个提供者列表,每个提供者都有一个名称,一个地址和一些ID。我想给用户一个盒子,他可以输入他知道的关于提供者的任何内容,并根据提供的内容运行搜索。基本上我想将框中的每个单词与索引中的记录(文档)进行匹配。

对于最终用户,这应该看起来像一个简单的关键字搜索。

匹配应涵盖完全匹配,外卡匹配,拼音匹配,同义词(名称)。还应包括一些模糊性。

官方网站介绍了各种方法,但如何将它们组合在一起?例如,为了支持通配符搜索,我使用通配符查询,还是使用NGram将其编入索引并进行文本查询?

使用SQL查询获取此类信息的某种方法是检查查询的执行计划。如果SQL优化器告诉您它将对相当大的表使用表扫描,您知道应该更改查询,或者可能是添加索引。 AFAIK在ES中没有相应的强大功能,我甚至不确定是否可以构建它。

但至少有一些通用考虑因素......?非常好......

2 个答案:

答案 0 :(得分:2)

没有最好的方法来做事,因为很多时候它取决于你的索引,以及你如何将数据映射到Elasticsearch中的变量。

您应注意的一些经验法则:

一个。 Elasticsearch中的分面查询按顺序工作:

{   
 "query": {
   // data will be searched from this block first //
 }, "facets": {
   // after the data is received, it will be processed into facets //
 }
}

因此,如果您的查询大小很大,您将通过分面进一步减慢查询速度。监控查询结果。

湾过滤器与查询

过滤器执行查询的一个子集,这意味着它将获取查询的整个结果,然后过滤掉您想要的或您不想要的内容。

查询通常是直接搜索数据。

因此,如果您可以在进行过滤之前使查询尽可能具体,那么它应该会产生更快的结果。

℃。查询被缓存;一次又一次地运行它们通常会产生更快的响应。如果您总是要使用相同的查询集,Warmers API应该能够更快地进行查询

同样,所有这些都是拇指规则,不能严格遵守,因为您索引特定变量会影响处理时间。字符串与long类型不同,带分析器的字符串与非分析器不同。您需要做的是尝试查询以获得更好的判断。

答案 1 :(得分:0)

上面的一个更正 - 过滤器可由ES缓存,而不是查询。查询执行相关性评分的额外步骤&全文检索。因此,建议不要使用过滤器进行全文搜索。

此外,使用正确的索引值设计映射(not_analyzed,no,analyze)