ElasticSearch编程操作
创建工程,导入坐标
<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.12</version>
</dependency>
</dependencies>
创建索引index
@Test
public void createIndex() throws Exception{
//1.创建一个settings对象 相当于配置信息
//连接集群
Settings settings= Settings.builder()
.put("cluster.name","my-elasticsearch")
.build();
//2.创建一个客户单Client对象
TransportClient client =new PreBuiltTransportClient(settings);
//设置节点
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9300));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9400));
client.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9500));
//3.使用Client对象创建一个索引库 创建一个名weeindexhello的索引
client.admin().indices().prepareCreate("index_hello")
//.get执行操作
.get();
//4.关闭Client
client.close();
}
创建映射mapping
@Test
public void setMappings() throws Exception{
//创建一个mapping信息
XContentBuilder builder= XContentFactory.jsonBuilder()
.startObject()
.startObject("article")
.startObject("properties")
.startObject("id")
.field("type","long")
.field("store",true)
.endObject()
.startObject("title")
.field("type","text")
.field("store",true)
.field("analyzer","ik_smart")
.endObject()
.startObject("content")
.field("type","text")
.field("store",true)
.field("analyzer","ik_smart")
.endObject()
.endObject()
.endObject()
.endObject();
//使用client把Mapping信息设置到索引库中
client.admin().indices()
//设置要映射的索引
.preparePutMapping("index_hello")
//设置要做映射的type
.setType("article")
//mapping信息 可以是XContentBuilder对象 可以是json格式的字符串
.setSource(builder)
//执行操作
.get();
//关闭连接
client.close();
}
建立文档document
@Test
public void testAddDocument() throws Exception{
//创建一个Client对象
//创建一个文档对象
XContentBuilder builder=XContentFactory.jsonBuilder()
.startObject()
.field("id",1L)
.field("title","春天要来了")
.field("content","一切好像刚睡醒的样子")
.endObject();
//使用client把文档对象添加到索引库 设置索引名称 设置type 设置id 如果不设置id 会自动生成一个
// 建立文档对象
/**
* 参数一blog1:表示索引对象
* 参数二article:类型
* 参数三1:建立id
*/
client.prepareIndex("index_hello","article","1")
//设置文档信息 执行操作
.setSource(builder).get();
//关闭客户端
client.close();
}
建立文档(使用Jackson转换实体)
实体类
private Long id;
private String title;
private String Content;
@Test
public void testAddDocument2() throws Exception{
//创建一个Article 实体类对象
Article article=new Article();
//设置对象的属性
article.setId(2L);
article.setTitle("大国工匠");
article.setContent("我们要大力弘扬与传承工匠精神");
//把Article对象转换成json格式的字符串
ObjectMapper objectMapper=new ObjectMapper();
String jsonDocument = objectMapper.writeValueAsString(article);
System.out.println(jsonDocument);
//使用Client对象把文档写入索引库
client.prepareIndex("index_hello","article","3")
.setSource(jsonDocument, XContentType.JSON)
.get();
//关闭客户端
client.close();
}
添加json转换器坐标
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.6</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0</version>
</dependency>
查询文档操作
抽取配置代码
@Before
public void init() throws Exception{
Settings settings= Settings.builder()
.put("Cluster.name","my-elasticsearch")
.build();
//创建一个TransPortClient对象
TransportClient client=new PreBuiltTransportClient(settings)
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9301))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9302))
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("127.0.0.1"),9303));
}
private TransportClient client;
private String field;
/**
*抽取查询方法
* @param queryBuilder
* @throws Exception
*/
private void search(QueryBuilder queryBuilder) throws Exception{
//执行查询
SearchResponse searchResponse = client.prepareSearch("index_hello")
//设置查询的type
.setTypes("article")
.setQuery(queryBuilder)
//设置分页信息
//起始行号
.setFrom(0)
//每页显示行数
.setSize(5)
.get();
//取查询结果
SearchHits hits = searchResponse.getHits();
//取查询结果的总记录条数
System.out.println("查询结果的总记录数"+hits.totalHits);
//查询结果列表
Iterator<SearchHit> iterator = hits.iterator();
//迭代结果集
while (iterator.hasNext()){
SearchHit searchHit = iterator.next();
//打印文档对象 以json格式输出
System.out.println(searchHit.getSourceAsString());
//也可以取文档的属性
System.out.println("--文档的属性--");
Map<String, Object> document = searchHit.getSource();
System.out.println(document.get("id"));
System.out.println(document.get("title"));
System.out.println(document.get("content"));
}
//关闭Clien
client.close();
}
@Test
/**
* 跟据id查询
*/
public void TestSearchById() throws Exception{
//创建一个client对象
//创建一个查询对象
QueryBuilder queryBuilder=QueryBuilders.idsQuery().addIds("1","2");
search(queryBuilder);
}
@Test
/**
* 跟据关键词查询
*/
public void testQueryByTerm() throws Exception{
//创建一个QueryBuilder 参数一 要搜索的字段 参数二 要搜索的关键词
QueryBuilder queryBuilder=QueryBuilders.termQuery("content","工匠");
//调用search方法传递queryBuilder参数
search(queryBuilder);
}
@Test
/**
*分析查询
*/
public void testQueryStringQuery() throws Exception{
//创建一个QueryBuilder对象
QueryBuilder queryBuilder=QueryBuilders.queryStringQuery("工匠精神")
//设置默认搜索域 不指定的话会在所有域上查询
.defaultField("title");
//执行查询
search(queryBuilder);
}
分页显示
/**
*抽取查询方法
* @param queryBuilder
* @throws Exception
*/
private void search(QueryBuilder queryBuilder) throws Exception{
//执行查询
SearchResponse searchResponse = client.prepareSearch("index_hello")
//设置查询的type
.setTypes("article")
.setQuery(queryBuilder)
//设置分页信息
//起始行号
.setFrom(0)
//每页显示行数
.setSize(5)
.get();
//取查询结果
SearchHits hits = searchResponse.getHits();
//取查询结果的总记录条数
System.out.println("查询结果的总记录数"+hits.totalHits);
//查询结果列表
Iterator<SearchHit> iterator = hits.iterator();
//迭代结果集
while (iterator.hasNext()){
SearchHit searchHit = iterator.next();
//打印文档对象 以json格式输出
System.out.println(searchHit.getSourceAsString());
//也可以取文档的属性
System.out.println("--文档的属性--");
Map<String, Object> document = searchHit.getSource();
System.out.println(document.get("id"));
System.out.println(document.get("title"));
System.out.println(document.get("content"));
}
//关闭Clien
client.close();
}
@Test
/**
* 查询分页显示设置
* 需要在Client执行查询之前设置
* //执行查询
* SearchResponse searchResponse = client.prepareSearch("index_hello")
* //设置查询的type
* .setTypes("article")
* .setQuery(queryBuilder)
* //设置分页信息
* //起始行号
* .setFrom(0)
* //每页显示行数
* .setSize(5)
* //执行操作
* .get();
* 分页需要设置两个值 一个from 一个size
* from: 起始行号 ,从0开始
* size: 每一页显示的记录数
*/
public void testQueryStringQuery2() throws Exception{
QueryBuilder queryBuilder=QueryBuilders.queryStringQuery("大国工匠")
.defaultField("title");
//执行查询
//在查询执行之前设置分页信息
search(queryBuilder);
}
查询结果高亮
什么是高亮显示
在进行关键字搜索时,搜索出的内容中的关键字会显示不同的颜色,称之为高亮。
ElasticSearch可以对查询出的内容中关键字部分进行标签和样式的设置,但是你需要告诉ElasticSearch使用什么标签对高亮关键字进行包裹
代码
private void search(QueryBuilder queryBuilder,String highlightField) throws Exception{
HighlightBuilder highlightBuilder=new HighlightBuilder();
//设置高亮显示的字段
highlightBuilder.field(highlightField);
//设置前缀
highlightBuilder.preTags("<em>");
//设置后缀
highlightBuilder.postTags("</em>");
//执行查询
SearchResponse searchResponse = client.prepareSearch("index_hello")
//设置查询的type
.setTypes("article")
.setQuery(queryBuilder)
//设置分页信息
//起始行号
.setFrom(0)
//每页显示行数
.setSize(5)
//设置高亮信息
.highlighter(highlightBuilder)
.get();
//取查询结果
SearchHits hits = searchResponse.getHits();
//取查询结果的总记录条数
System.out.println("查询结果的总记录数"+hits.totalHits);
//查询结果列表
Iterator<SearchHit> iterator = hits.iterator();
//迭代结果集
while (iterator.hasNext()){
SearchHit searchHit = iterator.next();
//打印文档对象 以json格式输出
System.out.println(searchHit.getSourceAsString());
//也可以取文档的属性
System.out.println("--文档的属性--");
Map<String, Object> document = searchHit.getSource();
System.out.println(document.get("id"));
System.out.println(document.get("title"));
System.out.println(document.get("content"));
//取高亮结果
System.out.println("——————————————————高亮结果————————————————");
Map<String, HighlightField> highlightFields = searchHit.highlightFields();
System.out.println(highlightFields);
//取title高亮显示的结果
HighlightField field = highlightFields.get(highlightField);
Text[] fragments = field.getFragments();
if (fragments!=null){
String title = fragments[0].toString();
System.out.println(title);
}
}
//关闭client
client.close();
}
@Test
/**
* 测试高亮查询
*/
public void testQueryStringQuery3() throws Exception{
QueryBuilder queryBuilder=QueryBuilders.queryStringQuery("大国工匠")
.defaultField("title");
search(queryBuilder,"title");
}