ElasticSearch 实现分词全文检索 - 高亮查询

elasticsearch,实现,分词,全文检索,查询 · 浏览次数 : 151

小编点评

# ElasticSearch 实现分词全文检索 **概述** ElasticSearch 提供分词全文检索的功能,允许您在搜索中使用多个关键词进行精确匹配。此功能可以帮助您在搜索中发现包含多个关键词的文档。 **安装和配置** 1. 安装和配置 Elasticsearch: ```bash # 在你的操作系统上安装 Elasticsearch sudo apt-get install elasticsearch # 配置 Elasticsearch sudo -e "ES_HEAP_SIZE=10737416;" \ elasticsearch/bin/elasticsearch.yml # 启动 Elasticsearch sudo systemctl start elasticsearch ``` **RESTful基本操作** 1. 建立一个 RESTful搜索客户端: ```java RestHighLevelClient client = ESClient.getClient(); ``` 2. 创建一个搜索请求对象: ```java SearchRequest request = new SearchRequest("sms-logs-index"); ``` 3. 添加查询条件: ```java SearchSourceBuilder builder = new SearchSourceBuilder(); builder.query(QueryBuilders.matchQuery("smsContent", "江苏")); ``` 4. 添加高亮条件: ```java HighlightBuilder highlightBuilder = new HighlightBuilder(); highlightBuilder.field("smsContent", 10) .preTags("") .postTags(""); ``` 5. 设置高亮参数: ```java request.source(builder); ``` 6. 执行搜索: ```java SearchResponse resp = client.search(request, RequestOptions.DEFAULT); ``` **Java SpringBoot ES 索引操作** 可以使用 Spring Boot 建立和管理 Elasticsearch 索引。 ```java @Autowired private ElasticsearchClient elasticClient; public void indexDocuments(List documentPaths) { for (String documentPath : documentPaths) { IndexResponse response = elasticClient.index(indexName, doc); } } ``` **Java SpringBoot ES 文档操作** 您可以使用 Spring Boot 提供的 API来操作 Elasticsearch 文档。 ```java @GetMapping("/documents/{id}") public Document getDocument(@PathVariable String id) { return elasticClient.get(indexName, doc, id); } ``` **测试数据准备** 您可以使用以下方式创建测试数据: ```bash # 创建一个 JSON 文档 cat << EOF { "smsContent": "江苏" } EOF # 将文档写入 Elasticsearch 中 curl -X POST -H "Content-Type: application/json" \ -d @document.json \ elasticsearch/index ``` **测试** 您可以使用以下命令测试分词全文检索功能: ```bash # 查询包含 "江苏" 的文档 curl -X GET -H "Content-Type: application/json" \ -d "{\"query\": {\"match\": {\"smsContent\": \"江苏\"}}}" \ elasticsearch/search ``` **总结** ElasticSearch 提供了一种简单易用的方法来实现分词全文检索。您可以使用 RESTful API 或 Java API来操作 Elasticsearch,并通过 Highlighting 功能进行文档高亮。

正文

目录

ElasticSearch 实现分词全文检索 - 概述
ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装
ElasticSearch 实现分词全文检索 - Restful基本操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作
ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作
ElasticSearch 实现分词全文检索 - 测试数据准备
ElasticSearch 实现分词全文检索 - term、terms查询
ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询
ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询
ElasticSearch 实现分词全文检索 - Scroll 深分页
ElasticSearch 实现分词全文检索 - delete-by-query
ElasticSearch 实现分词全文检索 - 复合查询
ElasticSearch 实现分词全文检索 - filter查询
ElasticSearch 实现分词全文检索 - 高亮查询
ElasticSearch 实现分词全文检索 - 聚合查询 cardinality
ElasticSearch 实现分词全文检索 - 经纬度查询
ElasticSearch 实现分词全文检索 - 搜素关键字自动补全(suggest)
ElasticSearch 实现分词全文检索 - SpringBoot 完整实现 Demo 附源码

数据准备

ElasticSearch 实现分词全文检索 - 测试数据准备

高亮查询

高亮查询,就是用户输入的关键字,以一定的特殊样式展示给用户,让用户知道为什么这个结果被检索出来
高亮展示的数据,本身就是文档中的一个Field,单独将Field以highlight的形式返回
ES提供了一个 highlight 属性,和 query 同级别的

  • fragment_size:指定返回多少个高亮数据,默认100
  • pre_tags:指定前缀标签 <font color="red">
  • post_tags:指定后缀标签 </font>
  • fields:指定哪几个字段以高亮形式返回
# highlight 查询
POST /sms-logs-index/_search
{
  "query": {
    "match":{
      "smsContent": "江苏"
    }
  },
  "highlight": {
    "fields": {
      "smsContent": {} #指定哪几个字段以高亮形式返回
    },
    "pre_tags": "<font color='red'>",
    "post_tags": "</font>"
  }
}

Java

@Test
void highlightQuery() throws Exception {
    String indexName = "sms-logs-index";
    RestHighLevelClient client = ESClient.getClient();

    //1. 创建SearchRequest对象
    SearchRequest request = new SearchRequest(indexName);

    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    builder.query(QueryBuilders.matchQuery("smsContent","江苏"));

    HighlightBuilder highlightBuilder = new HighlightBuilder();
    highlightBuilder.field("smsContent",10)
            .preTags("<font color='red'>")
            .postTags("</font>");
    builder.highlighter(highlightBuilder);
    request.source(builder);

    //3. 执行查询
    SearchResponse resp = client.search(request, RequestOptions.DEFAULT);

    //4. 输出返回值
    for (SearchHit hit : resp.getHits().getHits()) {
        System.out.println(hit.getHighlightFields());
    }
}

与ElasticSearch 实现分词全文检索 - 高亮查询相似的内容:

ElasticSearch 实现分词全文检索 - 高亮查询

目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES、Kibana、IK安装 ElasticSearch 实现分词全文检索 - Restful基本操作 ElasticSearch 实现分词全文检索 - Java SpringBoot E

ElasticSearch 实现分词全文检索 - Scroll 深分页

ES 对 from + size 有限制,两者之和不能超过1W Scroll查询方式,不适合做实时的查询,每次都是从数据文档中的ID去获取,效果高了,但文档中的ID(第二步)不是实时更新的,一般后台管理的方式用 Scroll 比较方便

ElasticSearch 实现分词全文检索 - filter查询

query,根据查询条件,去计算文档的匹配度得到一个分数,并且根据分数进行排序,不会做缓存。【精准匹配度高】 filter,根据查询条件去查询文档,不去计算分数,而且filter会对经常被过滤的数据进行缓存。【查询效率会高】

ElasticSearch 实现分词全文检索 - 复合查询

boosting 查询可以帮助我们去影响查询后的 score - positive:只有匹配上positive的查询的内容,才会被放到返回的结果中 - negative:如果匹配上和positive并且也匹配上了negative,就可以降低这样的文档 score. - negative_boost:指定系数,必须小于 1.0 关于查询时,分数是如何计算的: - 搜索的关键字在文档中出现的频次越高,

ElasticSearch 实现分词全文检索 - 概述

ES 是一个使用Java语言并且基于Lucene编写的搜索引擎框架,他提供了分布式的全文搜索功能,提供了一个统一的基于Restful风格的WEB接口,官方客户端也对多种语言都提供了相应的API。

ElasticSearch 实现分词全文检索 - ES、Kibana、IK分词器安装

先把zip下载下来。放到任意一台服务器(直接github上下载多数会失败)elasticsearch-plugin install http://172.16.0.183:8899/Java/elasticsearch-analysis-ik-7.9.3.zip

ElasticSearch 实现分词全文检索 - Restful基本操作

GET 请求: ``` http://ip:port/index: 查询索引信息 http://ip;port/index/type/doc_id: 查询指定的文档信息 ``` POST 请求: ``` http://ip;port/index/type/_search: 查询文档,可以在请求体中添加json字符串来代表查询条件 http://ip;port/index/type/doc_id/

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 索引操作

//1. 准备索引的 settings Settings.Builder settings = Settings.builder() //2. 准备索引的结构 Mappings XContentBuilder mappings = JsonXContent.contentBuilder() //3. 将 Settings 和 Mappings 封装到一个Request 对象中

ElasticSearch 实现分词全文检索 - Java SpringBoot ES 文档操作

//准备一个Request对象 IndexRequest request = new IndexRequest(indexName); request.id(person.getId().toString()); //手动指定ID request.source(personJson, XContentType.JSON); //通过 Client 对象执行

ElasticSearch 实现分词全文检索 - 测试数据准备

String json = JSON.toJSONStringWithDateFormat(sms, "yyyy-MM-dd HH:mm:ss"); FastJson 将日期格式化 BulkRequest bulkRequest = new BulkRequest(); Integer idx = 1; for (String json : jsonList) {