主要知识点

根据用户ID、是否隐藏、帖子ID、发帖日期来搜索帖子

一、准备数据

1、插入一些测试帖子数据

 
 

POST /forum/article/_bulk

{ "index": { "_id": 1 }}

{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" }

{ "index": { "_id": 2 }}

{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" }

{ "index": { "_id": 3 }}

{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" }

{ "index": { "_id": 4 }}

{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }

初步来说,就先定义4个字段并插入4条数据,因为整个es是支持json document格式的,所以说扩展性和灵活性非常好。如果后续随着业务需求的增加,要在document中增加更多的field,那么我们可以很方便的随时添加field。和关系型数据库比较,比如mysql,我们如果先建立了一个表,之后要给表中新增一些column,那就很麻烦了,必须用复杂的修改表结构的语法去执行。而且可能对系统代码还有一定的影响。

 
 

2、查看mapping结构

语法:GET /forum/_mapping/article

执行结果

{

"forum": {

"mappings": {

"article": {

"properties": {

"articleID": {

"type": "text",

"fields": {

"keyword": {

"type": "keyword",

"ignore_above": 256

}

}

},

"hidden": {

"type": "boolean"

},

"postDate": {

"type": "date"

},

"userID": {

"type": "long"

}

}

}

}

}

}

 
 

es5.x之后的版本,如果type=text,默认会设置两个field,一个是field本身,是分词的;还有一个是field.keyword,默认不分词,会最多保留256个字符,比如本例中的articleID

 
 

二、根据用户ID搜索帖子

 
 

GET /forum/article/_search

{

"query" : {

"constant_score" : {

"filter" : {

"term" : {

"userID" : 1

}

}

}

}

}

 
 

term 搜索(term filter/query),是指对搜索文本不分词,直接以原搜索文本到倒排索引中匹配,原样匹配。比如说,如果对搜索文本进行分词的话,"helle world" 会分成两个单词 "hello"和"world",两个词分别去倒排索引中匹配。只要匹配一个就是结果,如果是term搜索,那么就会以"hello world" 直接去倒排索引中匹配"hello world",只有全匹配才是结果。

 
 

三、搜索没有隐藏的帖子

 
 

GET /forum/article/_search

{

"query" : {

"constant_score" : {

"filter" : {

"term" : {

"hidden" : false

}

}

}

}

}

 
 

四、根据发帖日期搜索帖子

 
 

GET /forum/article/_search

{

"query" : {

"constant_score" : {

"filter" : {

"term" : {

"postDate" : "2017-01-01"

}

}

}

}

}

 
 

五、根据帖子ID搜索帖子

1、还是以term搜索的方式去搜索:

GET /forum/article/_search

{

"query" : {

"constant_score" : {

"filter" : {

"term" : {

"articleID" : "XHDK-A-1293-#fJ3"

}

}

}

}

}

执行结果如下,发现并没有找到结果,

{

"took": 1,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"failed": 0

},

"hits": {

"total": 0,

"max_score": null,

"hits": []

}

}

2、以.keywrod 方式去搜索:

GET /forum/article/_search

{

"query" : {

"constant_score" : {

"filter" : {

"term" : {

"articleID.keyword" : "XHDK-A-1293-#fJ3"

}

}

}

}

}

执行结果如下:发现已搜索出结果,

{

"took": 2,

"timed_out": false,

"_shards": {

"total": 5,

"successful": 5,

"failed": 0

},

"hits": {

"total": 1,

"max_score": 1,

"hits": [

{

"_index": "forum",

"_type": "article",

"_id": "1",

"_score": 1,

"_source": {

"articleID": "XHDK-A-1293-#fJ3",

"userID": 1,

"hidden": false,

"postDate": "2017-01-01"

}

}

]

}

}

通过比较发现:articleID.keyword,是es最新版本内置建立的field,就是不分词的。所以一个articleID建立的时候,会建立两次索引,一次是自己本身,是要分词的,分词后放入倒排索引;另外一次是基于articleID.keyword,不分词,最多保留256个字符后直接以一个字符串的形式放入倒排索引中。所以term filter,对text过滤,可以考虑使用内置的field.keyword来进行匹配。但是有个问题,默认就保留256个字符。所以尽可能还是自己去手动建立索引,指定not_analyzed(详情见第45小节)。在最新版本的es中,不需要指定not_analyzed也可以,将type=keyword即可。

 
 

3、查看分词

语法:

GET /forum/_analyze

{

"field": "articleID",

"text": "XHDK-A-1293-#fJ3"

}

执行结果:

{

"tokens": [

{

"token": "kdke",

"start_offset": 0,

"end_offset": 4,

"type": "<ALPHANUM>",

"position": 0

},

{

"token": "b",

"start_offset": 5,

"end_offset": 6,

"type": "<ALPHANUM>",

"position": 1

},

{

"token": "9947",

"start_offset": 7,

"end_offset": 11,

"type": "<NUM>",

"position": 2

},

{

"token": "kl5",

"start_offset": 13,

"end_offset": 16,

"type": "<ALPHANUM>",

"position": 3

}

]

}

默认如果是analyzed的text类型的field,建立倒排索引的时候,就会对所有的field进行分词,分词以后原本的articleID就没有了,只有分词后的各个word存在于倒排索引中。

term,是不对搜索文本分词的,XHDK-A-1293-#fJ3 对应的搜索文本就是 XHDK-A-1293-#fJ3;但是articleID建立索引的时候,XHDK-A-1293-#fJ3 已被分词为 xhdk,a,1293,fj3,所以找不到

 
 

4、重建索引

 
 

DELETE /forum

 
 

PUT /forum

{

"mappings": {

"article": {

"properties": {

"articleID": {

"type": "keyword"

}

}

}

}

}

5、再次插入数据

POST /forum/article/_bulk

{ "index": { "_id": 1 }}

{ "articleID" : "XHDK-A-1293-#fJ3", "userID" : 1, "hidden": false, "postDate": "2017-01-01" }

{ "index": { "_id": 2 }}

{ "articleID" : "KDKE-B-9947-#kL5", "userID" : 1, "hidden": false, "postDate": "2017-01-02" }

{ "index": { "_id": 3 }}

{ "articleID" : "JODL-X-1937-#pV7", "userID" : 2, "hidden": false, "postDate": "2017-01-01" }

{ "index": { "_id": 4 }}

{ "articleID" : "QQPX-R-3956-#aD8", "userID" : 2, "hidden": true, "postDate": "2017-01-02" }

 
 

6、重新根据帖子ID和发帖日期进行搜索

 
 

GET /forum/article/_search

{

"query" : {

"constant_score" : {

"filter" : {

"term" : {

"articleID" : "XHDK-A-1293-#fJ3"

}

}

}

}

}

 
 

六、总结

(1)term filter:根据exact value进行搜索,数字、boolean、date天然支持

(2)text需要建索引时指定为not_analyzed,才能用term query

(3)相当于SQL中的单个where条件

select * from forum.article where articleID='XHDK-A-1293-#fJ3'

2.使用term filter搜索数据的更多相关文章

  1. Elasticsearch结构化搜索_在案例中实战使用term filter来搜索数据

    1.根据用户ID.是否隐藏.帖子ID.发帖日期来搜索帖子 (1)插入一些测试帖子数据 POST /forum/article/_bulk { "index": { "_i ...

  2. Select2异步搜索数据

    $('#countryID').select2( { placeholder: "请选择国家", ajax: { dataType: 'json', type: 'POST', d ...

  3. (转)通过HTTP RESTful API 操作elasticsearch搜索数据

    样例数据集 这是编造的JSON格式银行客户账号信息文档,文档schema如下: { “account_number”: 0, “balance”: 16623, “firstname”: “Brads ...

  4. Android利用Filter过滤数据

    MainActivity如下: package cc.testfilterable; import java.util.ArrayList; import java.util.HashMap; imp ...

  5. Python之filter筛选数据工具

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #Python之filter筛选数据工具 #http://python.jobbole.com/82597/ ...

  6. Elasticsearch 搜索数据

    章节 Elasticsearch 基本概念 Elasticsearch 安装 Elasticsearch 使用集群 Elasticsearch 健康检查 Elasticsearch 列出索引 Elas ...

  7. 【ElasticSearch】ES 读数据,写数据与搜索数据的过程

    ES读数据的过程: 1.ES客户端选择一个node发送请求,该请求作为协调节点(coordinating node): 2.corrdinating node 对 doc id 对哈希,找出该文档对应 ...

  8. c# JD快速搜索工具,2015分析JD搜索报文,模拟请求搜索数据,快速定位宝贝排行位置。

    分析JD搜索报文 搜索关键字 女装 第二页,分2次加载. rt=1&stop=1&click=&psort=&page=3http://search.jd.com/Se ...

  9. 解决模糊查询问题 element UI 从服务器搜索数据,输入关键字进行查找

    做项目是遇见下拉框的形式,后台返回来3万多条,用element UI中的select选择器中的搜索还是会造成页面卡顿和系统崩溃,因此用了它的远程搜索功能,发现还不错,解决了这个问题. 代码1 < ...

随机推荐

  1. iconfont 不居中的问题

    引用 阿里的 iconfont 发现跟我的文字不居中 页面中实际展示的时候,发现 iconfont 字体飘起来了 原因是:iconfont 的基线跟 文字 的基线不同导致的. 解决办法:给 iconf ...

  2. Codeforces Round #271 (Div. 2) D.Flowers DP

    D. Flowers   We saw the little game Marmot made for Mole's lunch. Now it's Marmot's dinner time and, ...

  3. oc77--结构体,NSNumber,NSValue,NSDate,NSCalendar

    // // main.m // OC中的常用结构体 // #import <Foundation/Foundation.h> int main(int argc, const char * ...

  4. App设计师常用的10大网页和工具大盘点

    1.Adobe Photoshop 老牌的设计工具,不用解释 2.Adobe Illustrator 同上,不解释 3.Balsamiq Mockup 网址:http://balsamiq.com/ ...

  5. github fork项目更改后与原作者同步更新

    1.进入你的GitHub发起Pull request 2.选择compare across forks 3.反向操作.base fork改为自己的,head fork改为原作者的 4.点击 creat ...

  6. BZOJ 4304 tarjan+topsort+bitset

    我就是想骗一骗访问量 先Tarjan搞出来所有的强连通分量 正向连边 反向连边 topsort一发  搞出来每个点可以到哪些点 和哪些点可以到这个点 对于每条边 与一下  就是答案 //By Siri ...

  7. 为什么选择Android Studio 而是 Eclipse

    Android Studio 现在的版本已经比较稳定了,刚出来时也是各种BUG,自己用了下,摸索了一天,感觉挺好的. 优点之一:代码提示和搜索功能非常强大,非常智能. 1).自定义theme有个名字叫 ...

  8. Flume NG基本架构与Flume NG核心概念

    导读 Flume NG是一个分布式.可靠.可用的系统,它能够将不同数据源的海量日志数据进行高效收集.聚合.移动,最后存储到一个中心化数据存储系统中. 由原来的Flume OG到现在的Flume NG, ...

  9. 设置靠近 水平居中的主体内容Div 的 左侧位置固定的Div

    示例效果: 1.主体内容的divMain 水平居中: 2.divLeft 靠近divMain ,位置固定,不随垂直滚动条而动: 相关代码: <html> <head runat=&q ...

  10. windows server 2008 r2 安裝IE11

    https://support.microsoft.com/en-us/help/2847882/prerequisite-updates-for-internet-explorer-11 https ...