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

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

小编点评

## ElasticSearch 实现分词全文检索 **概述**: ElasticSearch 提供分词功能,允许您将文本分解成多个词,并搜索这些词。这使得您可以对文本进行更精确的搜索。 **安装**: 1. 安装 Elasticsearch:`pip install elasticsearch` 2. 启动 Elasticsearch 服务:`bin/elasticsearch.sh start` **Restful基本操作**: 1. 获取索引:`GET /sms-logs-index/_search` 2. 创建搜索请求:`POST /sms-logs-index/_search` 3. 设置查询条件:`query`字段包含布尔查询。 4. 执行搜索:`POST /sms-logs-index/_search` **Java SpringBoot ES 索引操作**: ```java @SpringBootTest public class EsTest { @Autowired private ElasticsearchClient client; @Test public void filterQuery() throws Exception { String indexName = "sms-logs-index"; RestHighLevelClient client = ESClient.getClient(); // 创建搜索请求 SearchRequest request = new SearchRequest(indexName); // 设置查询条件 SearchSourceBuilder builder = new SearchSourceBuilder(); BoolQueryBuilder boolQuery = QueryBuilders.boolQuery(); boolQuery.filter(QueryBuilders.termQuery("corpName", "阿里3")); boolQuery.filter(QueryBuilders.rangeQuery("fee").gte(20)); builder.query(boolQuery); // 执行查询 SearchResponse resp = client.search(request, RequestOptions.DEFAULT); // 输出搜索结果 for (SearchHit hit : resp.getHits().getHits()) { System.out.println(hit.getSourceAsMap()); } } } ``` **其他语言的示例**: * Python:`elasticsearch.search("sms-logs-index", query={"bool": {"filter": [ {"term": {"corpName": "阿里3"}} {"range": {"fee": {"gte": 20}} ]}]})` * JavaScript:`client.search("sms-logs-index", { query: { "bool": { "filter": [ { "term": "corpName", "value": "阿里3" }, { "range": { "fee": { "gte": 20 } } } ] } } } })` **测试数据准备**: ```json { "corpName": "阿里3", "fee": { "gte": 20 } } ``` **分词查询**: * `match` 查询:`POST /sms-logs-index/_search`,查询词语 "阿里3" * `match_all` 查询:`POST /sms-logs-index/_search`,查询词语 "阿里3" 的所有出现 * `multimatch` 查询:`POST /sms-logs-index/_search`,查询多个词语 "阿里3" * `id` 查询:`GET /sms-logs-index/_doc/1234` * `ids` 查询:`GET /sms-logs-index/_doc?ids=1234,5678` * `prefix` 查询:`POST /sms-logs-index/_search?prefix=ali` * `fuzzy` 查询:`POST /sms-logs-index/_search?query=ali*` * `wildcard` 查询:`POST /sms-logs-index/_search?query=ali?` * `range` 查询:`POST /sms-logs-index/_search?query=fee:20-30` * `regexp` 查询:`POST /sms-logs-index/_search?query=fee:20-30` **注意**: * 可以使用不同的搜索条件,例如词语匹配、范围查询等。 * 可以使用分词词典,加快搜索效率。 * 可以使用缓存机制提高查询效率。

正文

目录

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 附源码

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

# filter 查询
POST /sms-logs-index/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "corpName": "阿里3"
          }
        },
        {
          "range": {
            "fee": {
              "gte": 20
            }
          }
        }
      ]
    }
  }
}

Java


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

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

    //2. 指定查询条件
    SearchSourceBuilder builder = new SearchSourceBuilder();
    BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
    boolQuery.filter(QueryBuilders.termQuery("corpName","阿里3"));
    boolQuery.filter(QueryBuilders.rangeQuery("fee").gte(20));

    builder.query(boolQuery);
    request.source(builder);

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

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

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

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

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

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) {

ElasticSearch 实现分词全文检索 - term、terms查询

term 查询 term的查询是代表完全匹配,搜索之前不会对你搜索的关键字进行分词,对你的关键字去文档分词库中的去匹配内容 terms和term的查询机制是一样,都不会将指定的查询关键字进行分词,直接去分词库中匹配,找到相应文档内容。 terms是在针对一个字段包含多个值的时候使用。 term: where province = 江苏 terms: where province = 江苏 or p

ElasticSearch 实现分词全文检索 - match、match_all、multimatch查询

match查询属于高层查询,他会根据你查询的字段类型不一样,采用不同的查询方式。 - 查询的是日期或者是数值的话,他会将你基于的字符串查询内容转换为日期或者数值对待。 - 如果查询的内容是一个不能被分词的内容 (keyword) ,match查询不会对你指定的查询关键字进行分词。 - 如果查询的内容时一个可以被分词的内容 (text),match会将你指定的查询内容根据一定的方式去分词,去分词库中

ElasticSearch 实现分词全文检索 - id、ids、prefix、fuzzy、wildcard、range、regexp 查询

fuzzy查询:模糊查询,我们输入字符的大概,ES就可以 wildcard 查询:通配查询,和MySQL中的 like 差不多,可以在查询时,在字符串中指定通配符 * 和占位符? range 查询:范围查询,只针对数值类型,对某一个Field进行大于或小于的范围指定查询 regexp 查询: 正则查询,通过你编写的正则表达式去匹配内容