欢迎投稿

今日深度:

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

Elasticsearch 查询某些分类下相关的搜索,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

www.htsjk.Com true http://www.htsjk.com/Elasticsearch/35971.html NewsArticle Elasticsearch 查询某些分类下相关的搜索,elasticsearch分类 # Elasticsearch 查询某些分类下相关的搜索 某一个索引下面单独在某些个特定板块进行查询 在全站的索引下,排除某个索引下面的某...
相关文章
    暂无相关文章
评论暂时关闭