ES-查询搜索篇

REST介绍

REST(REpresentational State Transfer),字面意思为“表述性状态传输”,一种开发的约定。
REST约定用HTTP的请求头POST、GET、PUT、DELETE正好对应CRUD(Create、Read、Update、Delete)四种数据操作。

索引、映射的建立

索引的建立:

curl -X PUT http://localhost:9200/hospital/

{
  "settings": {
    "number_of_shards": 1,//分片数量
    "number_of_replicas": 0//副本分片数量
  }
}

映射的建立:

curl -X PUT http://localhost:9200/hospital/_mapping/medicine2?pretty

{
    "dynamic": false,
    "properties": {
      "standardName": {
        "type": "text",
        "index": "analyzed"
      },
      "pattern": {
        "type": "text"
      },
     "validDate": {
        "type": "keyword"
      }
    }
}

1、DSL篇

可以在java中输出SearchQueryBuilder,来查看对应的DSL(json格式)。

在ES中进行查询,默认的分词器对于单个汉字都会进行分词,标点符号不计入分词,以空格来间隔英语单词。对于not_analyzed不计入分词器,只能全部搜索(或者用通配符查询、前缀查询)。对于计入分词的,term、match*(match系列)、querystring都支持,而且查询比较良好。keyword或者数字类型,都只支持整个匹配。

说一说分页,分页都深度分页和游标分页。
深度分页是每一次都会从最新的数据中进行查询。适合于实时查询分页。因为深度分页与CPU、IO、带宽、内存都有关。所以需要限制深度分页的页数,防止因为以上原因(或爬虫)造成卡顿或者宕机。
游标分页是在你查询时,会初始化一个快照,在遍历时,从这个快照里取数据,也就是说,在初始化后对索引插入、删除、更新数据都不会影响遍历结果。适用于后端对于数据的大批量分析。

2、JAVA篇

以下所有的方法都写重点部分,需要样例,请参见GitHub:https://github.com/lingbao08/springboot-example.git

1. 创建查询容器
//此容器可以放置所有的queryBuilder
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
1. 查询字符串
//精确查询,查询有该分词的文档
QueryBuilder termQuery = QueryBuilders.termQuery(field, value);
//字符串查询,查询包含该分词的文档(英文只针对于单词,中文可能会拆开该词语:策略视分词器而定)
QueryBuilder termQuery = QueryBuilders.queryStringQuery(value)
             .field(field,2f);//可以指定单字段,也可以不指定,不指定按照默认字段查询
//              .fields(map)//多个字段
2.查询范围值
//可以只选大于而不选小于。可以用于查询日期、数字、字符串等。
//比较日期时注意和数据库格式一致
//不包含的范围查询
QueryBuilder range = QueryBuilders.rangeQuery(field).gt(0).lt(11);
//包含的范围查询
QueryBuilder range = QueryBuilders.rangeQuery(field).from(0).to(11);
3.IN查询
QueryBuilder terms = QueryBuilders.termsQuery("id", idList);
2.多字段匹配单值
MultiMatchQueryBuilder builder = QueryBuilders.multiMatchQuery(value, fields);
3.单(多)字段匹配多值
//构建匹配字段及其优先级
Map<String,Float> map = new HashMap();
 int length = fields.length;
 for (int i = 0; i < length; i++) {
        map.put(fields[i],Float.valueOf(length-i));
 }
//其中value中,eg:“A 神经 FFF” 表示这三个都搜索。
QueryBuilder termQuery = QueryBuilders.queryStringQuery(value).fields(map);
4.查询指定想要的字段(或不想要的字段)
SearchRequestBuilder srb = esClient.prepareSearch(indexName)
                    .setFetchSource(shows, null);//关键方法,前面为想要的字段,后面为不想要的字段
5.排序
SortBuilder sort = SortBuilders.fieldSort(field).order(SortOrder.ASC);
SortBuilders.scoreSort();//得分权重排序
//多个排序可以按照顺序来添加
SearchRequestBuilder srb = esClient.prepareSearch(indexName)
                    .addSort(defaultScoreSort()).addSort(sort);
4.计总数
ValueCountAggregationBuilder aggregation =
                    AggregationBuilders.count("count").field(field);
SearchRequestBuilder sr = esClient.prepareSearch(indexName).addAggregation(aggregation);
if (CollectionUtils.isNotEmpty(conditions))
      sr = sr.setQuery(builderQueries(conditions));
 SearchResponse response = sr.execute().get();
ValueCount count = response.getAggregations().get("count");
return count.getValue();
6.分页

在ES中分页有两种,一种是静态分页(又称游标分页),一种动态分页(又称深度分页)。

具体采用哪种分页,请参考上面DSL部分
动态分页

SearchRequestBuilder srb = esClient.prepareSearch(indexName)
                    .setFrom(from).setSize(pageSize);

静态分页(取自官网):

SearchResponse scrollResp = esClient.prepareSearch(indexName)
                .addSort(sort)
                .setScroll(new TimeValue(60000))//search context存活时间
                .setQuery(builderQueries(conditions))
                .setFrom(from).setSize(pageSize).get(); //max of 100 hits will be returned for each scroll
        //Scroll until no hits are returned
        do {
            for (SearchHit hit : scrollResp.getHits().getHits()) {
                //Handle the hit...
            }

            scrollResp = esClient.prepareSearchScroll(scrollResp.getScrollId()).setScroll(new TimeValue(60000)).execute().actionGet();
        }
        while (scrollResp.getHits().getHits().length != 0); // Zero hits mark the end of the scroll and the while loop.

5.插入单条
IndexResponse response = this.esClient.prepareIndex(indexName, typeName).setSource(objectMapper.writeValueAsBytes(t), XContentType.JSON).get();
if (responses.status() == RestStatus.OK) return true;
6.批量插入
BulkRequestBuilder bulkRequestBuilder = this.esClient.prepareBulk();

 for (T t : list) {
        IndexRequestBuilder indexRequestBuilder = esClient.prepareIndex(indexName, typeName).setSource(objectMapper.writeValueAsBytes(t), XContentType.JSON);
        bulkRequestBuilder.add(indexRequestBuilder);
 }

BulkResponse responses = bulkRequestBuilder.execute().actionGet();
if (responses.status() == RestStatus.OK) return true;
7.更新(单条)
UpdateResponse response = this.esClient.prepareUpdate(indexName, typeName, esId)
                    .setDoc(objectMapper.writeValueAsBytes(t), XContentType.JSON).get();
if (response.status() == RestStatus.OK) return true;
8.删除
BulkByScrollResponse response = DeleteByQueryAction.INSTANCE
                    .newRequestBuilder(esClient).source(indexName)
                    .filter(builderQueries(conditions)).get();

参考链接:https://www.elastic.co/guide/en/elasticsearch/client/java-api/5.6/index.html

中文分词

参见优化篇——中文分词。

分词包的使用

最近正在破解搜狗的scel文件,loading。。。。。。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,755评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,369评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,799评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,910评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,096评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,159评论 3 411
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,917评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,360评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,673评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,814评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,509评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,156评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,123评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,641评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,728评论 2 351

推荐阅读更多精彩内容