关于elasticsearch5.4.0的复杂搜索的学习

xiaoxiao2021-02-28  100

 

es 5.4.0

==========

最近看了很多es多条件搜索的文章,各有各的优特点,总结起来,提供自己学习:

 

1、使用 multi_match 和 match_phrase 配合使用:

http://blog.csdn.net/hereiskxm/article/details/47979013

{

  "query": {

     "multi_match": {         ## 匹配多个字段

    "query": "搜索的关键词",  

    "type": "phrase",         ## phrase 完全匹配

    "slop": 0,                  ## slop指定每个相邻词之间允许相隔多远。此处设置为0,以实现完全匹配。  

    "fields": [  

      "sender"  

       ],  

  }  

.....

}  

 

 

2、好理解的多条件搜索文章提供:

http://www.cnblogs.com/yjf512/p/4897294.html

 

 

3、官网

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-filters.html

=》之前百度了几种multi_match和filter结合的写法,实验都失败了!所以专门找了官网的filter的写法!

 

经过测试,正确的es-php代码,如下:

$query['bool'] = [ 'must'=>[ 'multi_match'=>[ 'query' => '金盒特价', 'type' => 'phrase', ## 完全匹配 'fields' => ['question_content', 'question_detail'], 'slop' => 10 ## 意思是完全匹配的时候,可以漏掉一个! ] ], 'filter'=>[ 'term'=>[ 'category_id'=>1    ## 过滤器:只选取category_id=1的数据! ] ] ]; $params['body']['query'] = $query;==================================================================4、match_phrase 和 best_fields 的比较,最后我们选择的是 best_fields // 设置好匹配条件$query = [  'multi_match'=>[                       ## 多个字段满足同一个关键词的查询!与type='phrase'配合很实用!    'query' => '金盒特价',    'type' => 'phrase',     ## 完全匹配某个关键词    'fields' => ['title','content'],    'slop' => 10     ## slop指定每个相邻词之间允许相隔多远。如果此处设置为0,则表示实现完全匹配!与type='phrase'配合使用,很实用!  ]]; 后来更改为:=》因为完全匹配的规则比较严格,我们希望完全匹配的靠前,但是同时保留中文分词的匹配!所有,最后还是使用下面这种:=》这种不太适合与时间排序组合使用,容易打乱完全匹配的关键词靠前的排序!!! $query['bool']['must'] = [         'multi_match'=>[    'query' => '金盒特价',    'type' => 'best_fields', ## 希望完全匹配的结果靠前    'tie_breaker' => 0.3, ## 除了完全匹配的结果,分词的匹配结果靠后    'fields' => ['title','content']  ]]; 5、如何做到按照中文分词的相关度进行排序的基础上,按照时间排序!且不能太影响相关度,正在研究!

 

转载请注明原文地址: https://www.6miu.com/read-73092.html

最新回复(0)