Elasticsearch 查询某些分类下相关的搜索

# 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.csdn.net/shiyaru1314/article/details/46896221
http://www.phperz.com/article/16/0229/201461.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值