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