首页 文章

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

提问于
浏览
3

是否有编写ES查询的指南 - 做什么,要避免什么,这类东西 . 官方网站描述了所有不同的搜索方式,但在选择什么时提供的内容很少 .

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

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

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

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

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

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

2 回答

  • 2

    没有最好的方法可以做,因为很多时候它取决于您的索引编制,以及如何将数据映射到Elasticsearch中的变量 .

    你应该注意的一些经验法则:

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

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

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

    湾过滤器与查询

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

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

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

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

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

  • 0

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

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

相关问题