Elasticsearch入门综合练习详解


pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.lichun</groupId>
<artifactId>lichun_elasticsearch</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
ESApplication.java
package com.lichun;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ESApplication {
public static void main(String[] args) {
SpringApplication.run(ESApplication.class, args);
}
}
Article.java
package com.lichun.pojo;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
import java.io.Serializable;
@Document(indexName = "blog03", type = "article")
public class Article implements Serializable {
@Id
private Long id;
@Field(type = FieldType.Text, index = true, store = false, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
private String title;
@Field(type = FieldType.Text, index = true, store = false, analyzer = "ik_smart", searchAnalyzer = "ik_smart")
private String content;
@Override
public String toString() {
return "Article{" +
"id=" + id +
", title='" + title + '\'' +
", content='" + content + '\'' +
'}';
}
public Article() {
}
public Article(Long id, String title, String content) {
this.id = id;
this.title = title;
this.content = content;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
ArticleDao.java
package com.lichun.dao;
import com.lichun.pojo.Article;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface ArticleDao extends ElasticsearchRepository<Article, Long> {
List<Article> findByTitle(String title);
List<Article> findByTitleAndContent(String title, String content);
@Query("{\"match\": {\"title\": {\"query\": \"?0\"}}}")
List<Article> renyimingzi(String rsuibianxie);
}
ESTest01.java
package com.lichun;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lichun.pojo.Article;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.xcontent.XContentType;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Map;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ESTest01 {
@Autowired
private TransportClient transportClient;
@Autowired
private ObjectMapper objectMapper;
@Test
public void create() throws Exception {
Article article = new Article(1L, "爱", "我爱王春婷");
IndexResponse indexResponse = transportClient.prepareIndex("blog01", "article", "1")
.setSource(objectMapper.writeValueAsString(article), XContentType.JSON)
.get();
System.out.println(indexResponse.getIndex() + ":" + indexResponse.getVersion() + ":" + indexResponse.getType());
}
@Test
public void delete() {
transportClient.prepareDelete("blog03", "article", "1").get();
}
@Test
public void select() {
GetResponse docuemntResponse = transportClient.prepareGet("blog01", "article", "1").get();
Map<String, Object> sourceAsMap = docuemntResponse.getSourceAsMap();
String sourceAsString = docuemntResponse.getSourceAsString();
System.out.println(sourceAsMap);
System.out.println(sourceAsString);
}
}
ESTest02.java
package com.lichun;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.lichun.pojo.Article;
import org.elasticsearch.action.admin.indices.mapping.put.PutMappingRequest;
import org.elasticsearch.action.bulk.BulkRequestBuilder;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.IOException;
import java.util.Map;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ESTest02 {
@Autowired
private TransportClient transportClient;
@Autowired
private ObjectMapper objectMapper;
@Test
public void onlyCreateIndex() {
transportClient.admin().indices().prepareCreate("blog03").get();
}
@Test
public void deleteIndex() {
transportClient.admin().indices().prepareDelete("blog03").get();
}
@Test
public void putMapping() throws Exception {
transportClient.admin().indices().prepareCreate("blog03").get();
PutMappingRequest putMappingRequest = new PutMappingRequest("blog03");
putMappingRequest.type("article");
XContentBuilder xContentBuilder = XContentFactory.jsonBuilder()
.startObject()
.startObject("article")
.startObject("properties")
.startObject("id")
.field("type","long")
.field("store","false")
.endObject()
.startObject("title")
.field("type","text")
.field("store","true")
.field("analyzer","ik_smart")
.field("index","true")
.endObject()
.startObject("content")
.field("type","text")
.field("store","true")
.field("analyzer","ik_smart")
.field("index","true")
.endObject()
.endObject()
.endObject()
.endObject()
;
putMappingRequest.source(xContentBuilder);
transportClient.admin().indices().putMapping(putMappingRequest).get();
}
@Test
public void createDocument() throws Exception {
Article article = new Article(1L, "爱", "我爱王春婷");
IndexResponse indexResponse = transportClient.prepareIndex("blog03", "article", "1")
.setSource(objectMapper.writeValueAsString(article), XContentType.JSON)
.get();
System.out.println(indexResponse.getIndex() + ":" + indexResponse.getVersion() + ":" + indexResponse.getType());
}
@Test
public void createDocumentJson() throws Exception{
XContentBuilder xcontentbuilder= XContentFactory.jsonBuilder()
.startObject()
.field("id",2)
.field("title","爱情有时候也不是很美好")
.field("content","王春婷哔哔哔")
.endObject();
transportClient.prepareIndex("blog03","article","2")
.setSource(xcontentbuilder)
.get();
}
@Test
public void createBatch() throws Exception {
long start = System.currentTimeMillis();
for (long i = 0; i < 100; i++) {
Article article = new Article(i, "爱" + i, "我爱王春婷" + i);
IndexResponse indexResponse = transportClient.prepareIndex("blog03", "article", i + "")
.setSource(objectMapper.writeValueAsString(article), XContentType.JSON)
.get();
}
long end = System.currentTimeMillis();
System.out.println("花费了:" + (end - start) + "ms");
}
@Test
public void createBatch02() throws Exception {
long start = System.currentTimeMillis();
BulkRequestBuilder bulkRequestBuilder = transportClient.prepareBulk();
for (long i = 0; i < 100; i++) {
Article article = new Article(i, "爱情是美好滴" + i, "我爱王春婷forever" + i);
String jsonstr = objectMapper.writeValueAsString(article);
IndexRequest request = new IndexRequest("blog03", "article", i + "");
request.source(jsonstr, XContentType.JSON);
bulkRequestBuilder.add(request);
}
bulkRequestBuilder.get();
long end = System.currentTimeMillis();
System.out.println("花费了:" + (end - start) + "ms");
}
@Test
public void mathchAllQuery() throws Exception {
QueryBuilder query = QueryBuilders.matchAllQuery();
SearchResponse response = transportClient
.prepareSearch("blog03")
.setTypes("article")
.setQuery(query)
.get();
SearchHits hits = response.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
String articleJson = hit.getSourceAsString();
System.out.println(articleJson);
objectMapper.readValue(articleJson, Article.class);
}
}
@Test
public void queryStringQuery() {
SearchResponse searchResponse = transportClient.prepareSearch("blog03")
.setTypes("article")
.setQuery(QueryBuilders.queryStringQuery("春婷").field("content"))
.get();
SearchHits hits = searchResponse.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println("搜索的到的数据:" + hit.getSourceAsString());
}
}
@Test
public void matchQuery() {
SearchResponse searchResponse = transportClient.prepareSearch("blog03")
.setTypes("article")
.setQuery(QueryBuilders.matchQuery("content", "春婷"))
.get();
SearchHits hits = searchResponse.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println("搜索的到的数据:" + hit.getSourceAsString());
}
}
@Test
public void multiMatchQuery() {
SearchResponse searchResponse = transportClient.prepareSearch("blog03")
.setTypes("article")
.setQuery(QueryBuilders.multiMatchQuery("春婷", "title", "content"))
.get();
SearchHits hits = searchResponse.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println("搜索的到的数据:" + hit.getSourceAsString());
}
}
@Test
public void wildcardQuery() {
SearchResponse searchResponse = transportClient
.prepareSearch("blog03")
.setTypes("article")
.setQuery(QueryBuilders.wildcardQuery("content", "美?"))
.get();
SearchHits hits = searchResponse.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println("搜索的到的数据:" + hit.getSourceAsString());
}
}
@Test
public void fuzzyQuery() {
SearchResponse searchResponse = transportClient
.prepareSearch("blog03")
.setTypes("article")
.setQuery(QueryBuilders.fuzzyQuery("content","forarer" ))
.get();
SearchHits hits = searchResponse.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println("搜索的到的数据:" + hit.getSourceAsString());
}
}
@Test
public void rangeQuery() {
SearchResponse searchResponse = transportClient
.prepareSearch("blog03")
.setTypes("article")
.setQuery(QueryBuilders.rangeQuery("id").from(5,true).to(10,true))
.get();
SearchHits hits = searchResponse.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println("搜索的到的数据:" + hit.getSourceAsString());
}
}
@Test
public void termQuery() {
SearchResponse searchResponse = transportClient
.prepareSearch("blog03")
.setTypes("article")
.setQuery(QueryBuilders.termQuery("title", "美好"))
.get();
SearchHits hits = searchResponse.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println("搜索的到的数据:" + hit.getSourceAsString());
}
}
@Test
public void boolQuery() {
TermQueryBuilder queryBuilder1 = QueryBuilders.termQuery("title", "美好");
RangeQueryBuilder queryBuilder2 = QueryBuilders.rangeQuery("id").gte(10).lt(15);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.filter(queryBuilder1);
boolQueryBuilder.filter(queryBuilder2);
SearchResponse searchResponse = transportClient
.prepareSearch("blog03")
.setTypes("article")
.setQuery(boolQueryBuilder)
.get();
SearchHits hits = searchResponse.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println("搜索的到的数据:" + hit.getSourceAsString());
}
}
@Test
public void pageSortQuery() {
SearchResponse searchResponse = transportClient
.prepareSearch("blog03")
.setTypes("article")
.setFrom(3)
.setSize(10)
.addSort("id", SortOrder.DESC)
.setQuery(QueryBuilders.termQuery("title", "爱情"))
.get();
SearchHits hits = searchResponse.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
System.out.println("搜索的到的数据:" + hit.getSourceAsString());
}
}
@Test
public void highlightQuery() throws IOException {
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder
.field("content")
.preTags("<span style=\"color:red\">")
.postTags("</span>");
SearchResponse searchResponse = transportClient
.prepareSearch("blog03")
.setTypes("article")
.highlighter(highlightBuilder)
.setQuery(QueryBuilders.matchQuery("content", "王春婷"))
.get();
SearchHits hits = searchResponse.getHits();
System.out.println("根据条件命中的总记录数:" + hits.getTotalHits());
for (SearchHit hit : hits) {
Map<String, HighlightField> highlightFields = hit.getHighlightFields();
HighlightField highlightField = highlightFields.get("content");
Text[] fragments = highlightField.getFragments();
StringBuffer sb = new StringBuffer();
for (Text fragment : fragments) {
String highlight = fragment.string();
sb.append(highlight);
}
String s = sb.toString();
Article article = objectMapper.readValue(hit.getSourceAsString(), Article.class);
article.setTitle(s);
System.out.println(article.toString());
}
}
}
TestDataES.java
package com.lichun;
import com.lichun.dao.ArticleDao;
import com.lichun.pojo.Article;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestDataES {
@Autowired
private ArticleDao articleDao;
@Autowired
private ElasticsearchTemplate elasticsearchTemplate;
@Test
public void createIndexAndMapping(){
elasticsearchTemplate.createIndex(Article.class);
elasticsearchTemplate.putMapping(Article.class);
}
@Test
public void createDoducmnet(){
List<Article> articles = new ArrayList<>();
for (long i = 0; i < 100; i++) {
Article article = new Article(i,"华为手机哼班123"+i,"华为手机OK"+i);
articles.add(article);
}
articleDao.saveAll(articles);
}
@Test
public void delete(){
articleDao.deleteById(1L);
}
@Test
public void select(){
List<Article> articles = articleDao.findByTitle("手机");
for (Article article : articles) {
System.out.println(article.getTitle());
}
}
}
|