# Elasticsearch 查询某些分类下相关的搜索
- 某一个索引下面单独在某些个特定板块进行查询
- 在全站的索引下,排除某个索引下面的某几个板块搜索
某一个索引下面单独在某些个特定板块进行查询
最近遇到了搜索的需求,然后产品需要对搜索的帖子指定相对应的板块,所有在相对应的ES的库当中,我们添加了一个fid的字段,然后使用ES进行搜索的时候,我们在相对应的DSL语句就添加了一个筛选的方法。看下面代码
--以下是全匹配,然后按照时间倒序排列,同时只在指定的fid的范围进行搜索,同时对搜索到的相关字段,在title里面加亮
{
"query": {
"filtered": {
"query": {
"match": {
"title": { "query": "人民大会堂", "type": "phrase" } }
},
"filter": {
"terms": {
"fid": [ 1,2,3 ] }
}
}
},
"sort": {
"create_time": {
"order": "desc"
}
},
"highlight": {
"pre_tags": [
"<em class=\"c_color\">"
],
"post_tags": [
"</em>"
],
"fields": {
"title": {}
}
},
"from": "0",
"size": "10"
}
在全站的索引下,排除某个索引下面的某几个板块搜索
除了上面的单独搜索帖子之外,还要一个综合的搜索,不仅是帖子,新闻,理财动态,此时也是要搜索帖子下面指定的几个板块,同时是综合搜索,是使用了function_score的函数,所有filter筛选方法和上面的就不太相同,所以就遇到了一个问题,其它索引,如新闻,动态是不存在fid的,所有没法区别,此时就有两个办法:1:在新闻和动态下面都添加上相对应的fid的字段,同时其fid的值,在帖子的板块是完全不存在的,这样子,直接加上一个filter筛选的条件即可。2:反过来看,直接将要搜索的帖子板块之外的板块全部筛选出来,然后排除就可以。
此时借鉴了下别人的资料,就是筛选的filter放置的位置:见1.
上述方法1的代码:
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "人人贷",
"type": "most_fields",
"fields": [ "title", "content" ] }
},
"filter": {
"term": {
"fid": 42 }
},
"functions": [
{
"field_value_factor": {
"field": "hit",
"modifier": "log1p",
"factor": 0.1 }
},
{
"field_value_factor": {
"field": "reply",
"modifier": "log1p",
"factor": 0.5 }
}
],
"boost_mode": "sum",
"max_boost": 2
}
},
"highlight": {
"fields": {
"pre_tags": [
"<tag1>",
"<tag2>"
],
"post_tags": [
"</tag1>",
"</tag2>"
],
"content": {},
"title": {}
}
},
"from": "0",
"size": "10"
}
方法2的代码:排除0,1,3板块的所有东西。搜索其它的板块的就可以了
{
"query": {
"function_score": {
"query": {
"multi_match": {
"query": "人人是你",
"type": "most_fields",
"fields": [ "title", "content" ] }
},
"filter": {
"bool": {
"must_not": { "term": { "fid": "0,1,3" } } }
},
"functions": [
{
"field_value_factor": {
"field": "hit",
"modifier": "log1p",
"factor": 0.1 }
},
{
"field_value_factor": {
"field": "reply",
"modifier": "log1p",
"factor": 0.5 }
}
],
"boost_mode": "sum",
"max_boost": 2
}
},
"highlight": {
"fields": {
"pre_tags": [
"<tag1>",
"<tag2>"
],
"post_tags": [
"</tag1>",
"</tag2>"
],
"content": {},
"title": {}
}
},
"from": "0",
"size": "10"
}
参考链接: http://blog.youkuaiyun.com/shiyaru1314/article/details/46896221
http://www.phperz.com/article/16/0229/201461.html