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