搜索与解析查询结果

本文为您介绍在OpenSearch中如何实现搜索优化以及如何解析查询结果。

搜索优化

这里主要介绍在实际查询过程中可能遇到的各种情况,及可以优化的方法。当您发现自己的搜索效果不满意或者不知道该如何实现,请联系我们。

搜索查询的效果主要跟query关键词中命中的文档数有关,命中的文档数越多,系统要进行的计算就越多,那么耗时就会越高。因此,优化的一个重要手段就是尽量降低query召回的文档数。

  1. 查询需要带上索引名(应用结构中的“索引名”),否则将默认取default索引,如果没有default,则直接报错无结果。

    query='mp3'相当于query=default:'mp3'
  2. 查询关键词必须带上单引号,否则很可能会报错无结果。

    Error:  query=default:mp3
    Right:  query=default:'mp3'
  3. 如果查询词中包含',则需要转义或者去掉;2,查询词的最后一个字符不能是'\',否则会被当成转义符从而导致查询报错,如果要搜索'\',需要对'\'进行转义。

    query=default:'北京大学',召回同时包含“北京”和“大学”的文档;
    query=default:'abc's efg'会解析失败无结果,需要修改为'abc\'s efg';
    query=default:'abc\',会查询报错无结果,\对'进行了转义,到时引擎解析失败;
  4. 对于只用来做过滤筛选的需求,建议尽量将过滤字段建立索引,通过query子句来查询,可以提高性能。

    query=user_id:'123'&&filter=type_id=1,改写为query=user_id:'123' AND type_id:'1'。
  5. 在一些情况下,会查询近一个月的数据,如果数据量较大,性能比较差,可以考虑使用range功能

    query=user_id:'123'&&filter=time>"2016-09-16"  //符合user_id=123的有5千万数据,但是根据时间过滤完只有1千。query召回量太大,很容易超时
    可以改为:
    query=user_id:'123' AND index_timestamp:(1473955200000,) //使用range查询效率会高很多。
  6. 查询到具体的文档后,引擎会去获取实际要返回的结果数据,如果结果数据较大,那么消耗的时间也会越长。这时,可以从以下几个方面入手:

    1. 降低hit数,一般翻页结果为20个。

    2. 修改默认展示字段或者fetch_fields,仅返回搜索结果展示中需要的字段即可。

解析查询结果

开放搜索产品,出于功能升级迭代需要,会不定期推出新功能,或对已有功能升级优化,实现用户的多样化功能或性能需求。

说明

解析注意:

基于产品需要功能升级迭代,查询结果中会根据需要,新增系统字段(比如 searchtime,viewtotal 之类的字段,就是系统字段)。

请确保在解析查询结果时,没有依赖查询结果中返回的字段个数,只是按需解析需要的字段。