elasticsearch的实现全文检索

本文介绍了Elasticsearch全文检索的基本概念,包括如何通过分词器实现全文索引,并重点讲解了内置分词器和中文分词器的使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

elasticsearch一个准实时的搜索引擎,基于lucene构建,它的主要强项还是在全文检索方面。工作中还是使用到了这部分功能,这里做一个简单的总结,可以使初次使用的人很快的配置和使用。
一、全文检索的概念
首先介绍全文检索的概念,就是对一篇文章进行索引,可以根据关键字搜索,类似于mysql里的like语句。
全文索引就是把内容根据词的意义进行分词,然后分别创建索引,例如”你们的激情是因为什么事情来的” 可能会被分词成:“你们“,”激情“,“什么事情“,”来“ 等token
这样当你搜索“你们” 或者 “激情” 都会把这句搜出来。
二、内置分词器
elasticsearch实现全文索引,首先要确定分词器,elasticsearch默认有很多分词器,你可以参考elasticsearch的官方文档。了解分词器主要是怎么实现的。
你可以使用
curl -XPOST http://192.168.0.23:9200/fenci/_analyze?analyzer=standard&pretty=true&text=“我是中国人”
命令来了解各种分词器的分词效果。
{
“token”: “我”,
“start_offset”: 1,
“end_offset”: 2,
“type”: “”,
“position”: 0
}
,
{
“token”: “是”,
“start_offset”: 2,
“end_offset”: 3,
“type”: “”,
“position”: 1
}
,
{
“token”: “中”,
“start_offset”: 3,
“end_offset”: 4,
“type”: “”,
“position”: 2
}
,
{
“token”: “国”,
“start_offset”: 4,
“end_offset”: 5,
“type”: “”,
“position”: 3
}
,
{
“token”: “人”,
“start_offset”: 5,
“end_offset”: 6,
“type”: “”,
“position”: 4
}
三、中文分词器
一般中文分词器一般使用第三方的ik分词器、mmsegf分词器和paoding分词器,他们最初可能构建于lucene,后来移植于elasticsearch。 在最新版的elasticsearch,我主要使用了ik分词器。
我使用的elsaticsearch是2.3.3,elasticsearch和ik分词的对应版本:
这里写图片描述
ik分词的安装:
去ik分词的github去下载源码用maven编译:
对应目录:
这里写图片描述

IndicesAdminClient indicesAdminClient = client.admin().indices();
        AnalyzeAction analyzeAction =  AnalyzeAction.INSTANCE;
        System.out.println("ik分词分析:"+"中华人民共和国国歌 ");
        AnalyzeRequestBuilder request = new  AnalyzeRequestBuilder(indicesAdminClient,analyzeAction,"text","中华人民共和国国歌");
        request.setAnalyzer("ik_max_word");
      //  request.setAnalyzer("ik_smart");
        request.setTokenizer("ik");
// Analyzer(分析器)、Tokenizer(分词器)
        List<AnalyzeResponse.AnalyzeToken> listAnalysis = request.execute().actionGet().getTokens();
        for( AnalyzeResponse.AnalyzeToken b : listAnalysis ){
            System.out.println( b.getTerm() );
        }

ik_max_word: 会将文本做最细粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,中华人民,中华,华人,人民共和国,人民,人,民,共和国,共和,和,国国,国歌”,会穷尽各种可能的组合;
这里写图片描述
ik_smart: 会做最粗粒度的拆分,比如会将“中华人民共和国国歌”拆分为“中华人民共和国,国歌”。
这里写图片描述
可根据需求去选择所需要的分词器。

### ElasticSearch 全文检索实现方法 ElasticSearch 是一种分布式搜索引擎,具有强大的全文检索功能。它通过倒排索引技术实现了高效的数据存储和快速的查询响应[^1]。 #### 倒排索引的工作原理 在 ElasticSearch 中,全文检索的核心依赖于倒排索引机制。当文档被索引入库时,其文本内容会被分析器拆分为词条(tokens),并建立一个映射表,记录每个词条出现在哪些文档中以及具体位置。这种结构使得即使面对海量数据,也可以迅速定位包含特定关键词的文档[^4]。 #### Java 客户端操作 Elasticsearch 的基本流程 为了向 Elasticsearch 插入数据并通过 API 进行全文检索,通常需要借助官方提供的客户端工具完成连接配置、数据写入及查询逻辑构建等工作[^2]。以下是基于 Java 高级 REST Client 的简单示例: ```java import org.elasticsearch.action.index.IndexRequest; import org.elasticsearch.action.search.SearchRequest; import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.client.RequestOptions; import org.elasticsearch.client.RestHighLevelClient; import org.elasticsearch.common.xcontent.XContentType; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.builder.SearchSourceBuilder; public class EsExample { public static void main(String[] args) throws Exception { RestHighLevelClient client = new RestHighLevelClient(/*初始化参数*/); // 数据插入 IndexRequest request = new IndexRequest("my_index"); String jsonString = "{" + "\"title\":\"The Quick Brown Fox\"," + "\"content\":\"A quick brown fox jumps over the lazy dog\"}"; request.source(jsonString, XContentType.JSON); client.index(request, RequestOptions.DEFAULT); // 构建 match 查询请求 SearchSourceBuilder sourceBuilder = new SearchSourceBuilder(); sourceBuilder.query(QueryBuilders.matchQuery("content", "quick fox")); SearchRequest searchRequest = new SearchRequest("my_index"); searchRequest.source(sourceBuilder); SearchResponse response = client.search(searchRequest, RequestOptions.DEFAULT); System.out.println(response.toString()); client.close(); } } ``` 上述代码展示了如何利用 `RestHighLevelClient` 将一条 JSON 文档存入名为 `my_index` 的索引,并执行一次简单的 `match` 类型查询以查找含有指定短语的相关条目。 #### Match_Phrase 查询详解 如果希望进一步精确化搜索条件,则可采用 `match_phrase` 方法代替普通的 `match` 。前者不仅要求目标字段内存在所有给定单词,还强调这些词语需按顺序紧挨排列才能算作命中结果[^3]。例如下面这个例子就专门针对文章标题部分寻找完全匹配 “quick fox” 字串的情形: ```json GET /my_index/_search { "query": { "match_phrase": { "title": "quick fox" } } } ``` 此命令返回那些在其 title 属性里确切表述为“quick fox”的项目集合。 #### 总结 综上所述,ElasticSearch 提供了多种灵活而强大的手段来进行全文本形式的信息挖掘活动;无论是基础层面的支持还是复杂场景下的定制需求都能得到良好满足。开发者只需按照既定模式编写相应脚本即可轻松调用相关服务接口达成预期目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值