官网:https://www.elastic.co/cn/start
推荐Kibana可视化工具
kibana启动之后,访问链接测试
http://localhost:5601/
2.简介索引(index):索引是映射类型的容器,它是一个非常大的文档集合,索引存储了映射类型的字段和 其他设置。
类型(type):类型是文档的逻辑容器,就像关系型数据库一样
文档(document):一个文档同时包含字段和对应的值,也就是同时包含key:value
字段类型:
text和keyword的区别
name:text类型
friend:keyword类型
text类型查询结果:
keyword类型查询结果:
text类型会根据查询关键词进行模糊匹配,而keyword只会关键精准匹配
3.分词器 3.1默认分词器(standard)中文都是单个拆除,英文按照单词划分
3.2simple分词器simple 分析器当它遇到只要不是字母的字符,就将文本解析成term,而且所有的term都是小写的
【分词方式】先按照空格分词,英文大写转小写,不是英文不分词。
3.3Whitespace分词器【分词方式】按空格分词,英文不区分大小写,中文不再分词
3.4ik分词器下载地址 https://github.com/medcl/elasticsearch-analysis-ik/releases
es的plugins目录中新建一个ik目录,然后将下载的文件解压到ik目录中,最后重启es
3.4.1ik_smart粗粒度划分,将文本截断
3.4.2 ik_max_word细粒度划分,会有重复的情况
3.4.3自定义字典在ik分词器中的IKAnalyzer.cfg文件新增自定义的字典文件
重启es
自定义的词典也拆分了
4.操作1.创建索引
不指定mapping,es会在put记录的时候,会自动创建mapping
2.指定docId查询
3.ik分词器查询
4.term过滤
term主要用于精确匹配哪些值,比如数字,日期,布尔值或 not_analyzed 的字符串(未经分析的文本数据类型)
match查询属于一种全文查询或者精确查询,term是用于精确查询,精确keyword进行倒排查询
5.terms过滤:类型数据库in查询
6.range范围查询
7.排序(年龄倒叙)
8.分页
from:起始值
size:每页数量
9.bool查询
must: 多个同时匹配,相当于and
must_not: 多个条件匹配相反,相当于not
should: 至少有一个匹配,相当于or
10.高亮查询
pre_tags:自定义前置标签
post_tags:自定义后置标签
5.Springboot整合espom引入:
1.8 7.15.1 org.springframework.boot spring-boot-starter-data-elasticsearchorg.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-devtoolsruntime true org.springframework.boot spring-boot-configuration-processortrue org.projectlombok lomboktrue org.springframework.boot spring-boot-starter-testtest com.google.code.gson gson
配置类注入
@Configuration
public class ESClientConfig {
private final static String HOST_NAME = "127.0.0.1";
private final static int PORT = 9200;
private final static String SCHEME = "http";
@Bean
public RestHighLevelClient restHighLevelClient() {
HttpHost httpHost = new HttpHost(HOST_NAME, PORT, SCHEME);
RestClientBuilder builder = RestClient.builder(httpHost);
RestHighLevelClient client = new RestHighLevelClient(builder);
return client;
}
}
es操作
private final static String INDEX_NAME = "springboot-demo";
@Resource
private RestHighLevelClient restHighLevelClient;
private static Gson gson = new Gson();
@Test
void createIndex() throws Throwable {
CreateIndexRequest request = new CreateIndexRequest(INDEX_NAME);
restHighLevelClient.indices().create(request, RequestOptions.DEFAULT);
}
@Test
void getIndex() throws Throwable {
GetIndexRequest request = new GetIndexRequest(INDEX_NAME);
GetIndexResponse response = restHighLevelClient.indices().get(request, RequestOptions.DEFAULT);
log.info("mappings={} n settings={}", gson.toJson(response.getMappings()),
gson.toJson(response.getSettings()));
}
@Test
void existIndex() throws Throwable {
GetIndexRequest request = new GetIndexRequest(INDEX_NAME);
boolean exists = restHighLevelClient.indices().exists(request, RequestOptions.DEFAULT);
log.info("exists={}", exists);
}
@Test
void deleteIndex() throws Throwable {
DeleteIndexRequest request = new DeleteIndexRequest(INDEX_NAME);
AcknowledgedResponse response = restHighLevelClient.indices().delete(request, RequestOptions.DEFAULT);
log.info("isAcknowledged={}" + response.isAcknowledged());
}
@Test
void createDoc() throws Throwable {
IndexRequest request = new IndexRequest(INDEX_NAME);
// 方式一:采用对象转Gson的方式创建文档
Book book = new Book("Java编程思想", 100, Lists.newArrayList("Java", "经典", "入门", "语言"));
request.id("001");
request.timeout(Timevalue.timevalueSeconds(5));
request.source(gson.toJson(book), Requests.INDEX_CONTENT_TYPE);
IndexResponse response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
log.info("response={}", response);
// 方式二:采用逐一传参的方式创建文档
request.id("002");
request.timeout(Timevalue.timevalueSeconds(5));
request.source("name", "Spring Boot编程思想", "price", 110, "tags", Lists.newArrayList("SpringBoot",
"Spring", "新书"));
response = restHighLevelClient.index(request, RequestOptions.DEFAULT);
log.info("response={}", response);
// 方式三:批量创建文档
List books = Lists.newArrayList(new Book("a", 1, Lists.newArrayList("a1")),
new Book("b", 2, Lists.newArrayList("b2")),
new Book("c", 3, Lists.newArrayList("c3")),
new Book("d", 4, Lists.newArrayList("d4")));
BulkRequest bulkRequest = new BulkRequest(INDEX_NAME);
AtomicInteger id = new AtomicInteger(1);
books.stream().forEach(b -> bulkRequest.add(
new IndexRequest(INDEX_NAME)
.id(String.valueOf(id.getAndIncrement())) // 指定文档id,不指定则取默认值
.source(gson.toJson(b), Requests.INDEX_CONTENT_TYPE)));
BulkResponse bulkResponse = restHighLevelClient.bulk(bulkRequest, RequestOptions.DEFAULT);
log.info("bulkInsert is success={}", !bulkResponse.hasFailures());
}
@Test
void getDoc() throws Throwable {
GetRequest request = new GetRequest(INDEX_NAME, "001");
boolean exists = restHighLevelClient.exists(request, RequestOptions.DEFAULT);
log.info("exists={}", exists);
GetResponse response = restHighLevelClient.get(request, RequestOptions.DEFAULT);
log.info("response={} n source={}", gson.toJson(response), response.getSourceAsString());
}
@Test
void updateDoc() throws Throwable {
// 方法一:直接修改响应属性
UpdateRequest request = new UpdateRequest(INDEX_NAME, "001");
request.doc("name", "Java编程思想最新版");
UpdateResponse response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
log.info("status={}", response.status());
// 方式二:Gson方式更新
Book book = new Book("Spring Boot编程思想", 110, Lists.newArrayList("SpringBoot", "Spring",
"新书")); // 这个book对象,应该从ES中获取;为了方便,此处我就直接new了
book.setName("Spring Boot编程思想最新版");
request = new UpdateRequest(INDEX_NAME, "002");
request.doc(gson.toJson(book), Requests.INDEX_CONTENT_TYPE);
response = restHighLevelClient.update(request, RequestOptions.DEFAULT);
log.info("status={}", response.status());
}
@Test
void searchDoc() throws Throwable {
SearchRequest request = new SearchRequest(INDEX_NAME);
SearchSourceBuilder builder = new SearchSourceBuilder();
builder.timeout(Timevalue.timevalueSeconds(10));
builder.query(QueryBuilders.matchQuery("name", "思想"));
// builder.query(QueryBuilders.termQuery("name", "思想"));
builder.from(0);
builder.size(10);
builder.highlighter(new HighlightBuilder().field("name").preTags("").postTags(" ")); // 高亮
request.source(builder);
SearchResponse response = restHighLevelClient.search(request, RequestOptions.DEFAULT);
Arrays.stream(response.getHits().getHits()).forEach(System.out::println);
}
@Test
void deleteDoc() throws Throwable {
DeleteRequest request = new DeleteRequest(INDEX_NAME, "001");
DeleteResponse response = restHighLevelClient.delete(request, RequestOptions.DEFAULT);
log.info("status={}", response.status());
}



