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

 

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、如何做到按照中文分词的相关度进行排序的基础上,按照时间排序!且不能太影响相关度,正在研究!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值