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

 

es 5.4.0

语言:php

==========

最近看了很多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 的比较
// 设置好匹配条件
$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、如何做到按照中文分词的相关度进行排序的基础上,按照时间排序!且不能太影响相关度,正在研究!

 // 关于多字段排序,但是效果不是特别好

$params['body']['sort'] = [
      '_score'=>'desc',      ## 按照相关度的评分进行排序,其次按照add_time排序,但是效果还是不是很明显!
  'add_time' => 'desc'
];

 

posted @ 2017-08-31 10:47  素还真1990  阅读(409)  评论(0)    收藏  举报