Elasticsearch入门之java操作客户端
一.创建Elasticsearch工程
导入pom文件
<dependencies>
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>5.6.8</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.9.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.24</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
</dependency>
二.创建文档
1.默认方式创建索引
@Test
public void createIndex() throws Exception {
//1.创建es客户端对象
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress
.getByName("127.0.0.1"), 9300));
//2.创建文档内容
XContentBuilder contentBuilder = XContentFactory.jsonBuilder()
.startObject()
.field("id", 1)
.field("title", "elasticsearch是一个基于lucene的搜索服务")
.field("content", "ElasticSearch是一个基于Lucene的搜索服务器。\" +\n" +
"\"它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。\" +\n" +
"\"Elasticsearch是用Java开发的,并作为Apache许可条款下的开放源码发布,\" +\n" +
"\"是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,\" +\n" +
"\"可靠,快速,安装使用方便。")
.endObject();
//3.创建文档对象
IndexResponse response = transportClient.prepareIndex("blog1", "article", "1")
.setSource(contentBuilder)
.get();
//获取返回的状态
RestStatus status = response.status();
System.out.println(status);
//4.释放资源
transportClient.close();
}
2.通过Map所以你的方式添加索引
Map<String,Object> map = new HashMap<String, Object>();
map.put("id","2");
map.put("title","这是一个基于lucene的搜索服务");
map.put("content","这是一个基于Lucene的搜索服务器文件");
//3.创建文档对象
IndexResponse response = transportClient.prepareIndex("blog1", "article", "2")
.setSource(map)
.get();
三.搜索文档数据
1.搜索所有的数据
//查询所有
@Test
public void searchAll() throws Exception{
//1创建客户端对象
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY).
addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//2.构建搜索内容
SearchResponse response = transportClient.prepareSearch("blog1").setTypes("article")
.setQuery(QueryBuilders.matchAllQuery())
.get();
//获取搜索结果
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
//遍历结果
Iterator<SearchHit> iterator = hits.iterator();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
//关闭资源
transportClient.close();
}
2.字符串查询
//字符串查询
@Test
public void StringSarech()throws Exception{
//1.创建客户端对象
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//2.构建查询条件
SearchResponse response = transportClient.prepareSearch("blog")
.setTypes("article")
.setQuery(QueryBuilders.queryStringQuery("这是"))
.get();
//获得查询结果
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
Iterator<SearchHit> iterator = hits.iterator();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
//关闭资源
transportClient.close();
}
3.模糊查询
//模糊查询
@Test
public void testWildCardSearch() throws Exception{
//1.创建客户端对象
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//2.构建查询条件
SearchResponse response = transportClient.prepareSearch("blog")
.setTypes("article")
.setQuery(QueryBuilders.wildcardQuery("title", "生成*"))
.get();
//获取结果
SearchHits hits = response.getHits();
System.out.println(hits.getTotalHits());
Iterator<SearchHit> iterator = hits.iterator();
for (SearchHit hit : hits) {
System.out.println(hit.getSourceAsString());
}
//关闭资源
transportClient.close();
}
注意;在这我们没有进行中文分词所以查不到,所以我们必须集成IK分词器,才能进行模糊查询
4.词条查询
//词条查询
@Test
public void testItemSearch()throws Exception{
//1.创建客户端
TransportClient transportClient = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//2.创建需要查询的词条
SearchResponse response = transportClient.prepareSearch("blog1")
.setTypes("article")
.setQuery(QueryBuilders.termQuery("content", "搜索"))
.get();
//获得查询的结果
SearchHits hits = response.getHits();
System.out.println("查询结果有:"+hits.getTotalHits()+"条");
Iterator<SearchHit> iterator = hits.iterator();
for (SearchHit hit : hits) {
SearchHit next = iterator.next();//每个查询对象
System.out.println(hit.getSourceAsString());//获取字符串格式打印
System.out.println("title:"+next.getSource().get("title"));
}
//4.释放资源
transportClient.close();
}
四.IK分词器与Elasticsearch集成
集成ik分词器的jar
启动es时出现这个就集成完毕
IK分词器的介绍:
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,
IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Lucene为应用主体的,结合词典分词和文法分析算法的
中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对
Lucene的默认优化实现。
IK分词器3.0的特性如下:
1)采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。 2)采用了多子处理器分析模
式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词
汇(姓名、地名处理)等分词处理。 3)对中英联合支持不是很好,在这方面的处理比较麻烦.需再做一次查询,同时
是支持个人词条的优化的词典存储,更小的内存占用。 4)支持用户词典扩展定义。 5)针对Lucene全文检索优化
的查询分析器IKQueryParser;采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命
中率
2. IK分词器测试
IK提供了两个分词算法ik_smart 和 ik_max_word
其中 ik_smart 为最少切分,ik_max_word为最细粒度划分
我们分别来试一下
1)最小切分:在浏览器地址栏输入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_smart&pretty=true&text=我是程序员
输出的结果为:
2)最细切分:在浏览器地址栏输入地址
http://127.0.0.1:9200/_analyze?analyzer=ik_max_word&pretty=true&text=我是程序员
作者:wangwei_620
来源:优快云
原文:https://blog.youkuaiyun.com/wangwei_620/article/details/86498241
版权声明:本文为博主原创文章,转载请附上博文链接!