1.是什么?
倒排索引
2.哪里下?
elasticsearch,kinaba:
https://www.elastic.co/cn/elasticsearch/
elasticsearch-head-master:
https://github.com/mobz/elasticsearch-head
ik分词器:
https://github.com/medcl/elasticsearch-analysis-ik/releases
//帮助文档
https://www.elastic.co/guide/index.html
3.怎么用?
kinaba设置中文
elasticsearch
#跨域配置:
http.cors.enabled: true
http.cors.allow-origin: "*"
ik分词器用法
解压到plugins目录下
ik目录下可配置自己的字典
-
新建my.dic文件
-
文件里输入自定义词汇
-
配置文件里加载my.dic
-
重启ElasticSearch
-
最小拆分和最细粒度拆分
查询
keyword和text区别
keyword类型是一个整体,text会被分词
API调用
package com.es;
import com.alibaba.fastjson.JSON;
import com.es.pojo.User;
import com.es.util.Es;
import org.apache.lucene.util.QueryBuilder;
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.delete.DeleteRequest;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.support.master.AcknowledgedResponse;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.CreateIndexRequest;
import org.elasticsearch.client.indices.CreateIndexResponse;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.client.indices.GetIndexResponse;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.TermQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.FetchSourceContext;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
@SpringBootTest
class DemoApplicationTests {
@Autowired
@Qualifier("RestHighLevelClient")
private RestHighLevelClient client;
//创建索引
@Test
void contextLoads() throws IOException {
CreateIndexRequest index = new CreateIndexRequest("kun_index");
CreateIndexResponse createIndexResponse = client.indices().create(index, RequestOptions.DEFAULT);
System.out.println(createIndexResponse.isAcknowledged());
}
//索引是否存在
@Test
void test02() throws IOException {
GetIndexRequest index = new GetIndexRequest("kun_index");
boolean exists = client.indices().exists(index, RequestOptions.DEFAULT);
System.out.println(exists);
}
//删除索引
@Test
void test03() throws IOException {
DeleteIndexRequest kun_index = new DeleteIndexRequest("kun_index");
AcknowledgedResponse delete = client.indices().delete(kun_index, RequestOptions.DEFAULT);
System.out.println(delete.isAcknowledged());
}
//创建文档
@Test
void test04() throws IOException {
User user = new User( "kun", "kun desc");
IndexRequest req = new IndexRequest("kun_index");
req.id("1");
req.source(JSON.toJSONString(user), XContentType.JSON);
IndexResponse index = client.index(req, RequestOptions.DEFAULT);
System.out.println(index);
System.out.println(index.status());
}
//查看文档是否存在
@Test
void test05() throws IOException {
GetRequest req = new GetRequest("kun_index", "1");
//不获取_source的上下文
req.fetchSourceContext(new FetchSourceContext(false));
req.storedFields("_none_");
boolean exists = client.exists(req, RequestOptions.DEFAULT);
System.out.println(exists);
}
//查看文档信息
@Test
void test06() throws IOException {
GetRequest req = new GetRequest("kun_index", "1");
GetResponse document = client.get(req, RequestOptions.DEFAULT);
System.out.println(document.getSource());
System.out.println(document.getId());
System.out.println(document.getSourceAsMap());
}
//更新文档信息
@Test
void test07() throws IOException {
UpdateRequest req = new UpdateRequest("kun_index","1");
User user = new User("kun_update", "kun_desc_update");
req.doc(JSON.toJSONString(user),XContentType.JSON);
req.timeout(TimeValue.timeValueSeconds(1));
UpdateResponse update = client.update(req, RequestOptions.DEFAULT);
System.out.println(update.status());
}
//删除文档信息
@Test
void test08() throws IOException {
DeleteRequest req = new DeleteRequest("kun_index", "1");
req.timeout("1s");
DeleteResponse delete = client.delete(req, RequestOptions.DEFAULT);
System.out.println(delete.status());
}
@Test
void test09() throws IOException {
BulkRequest bulk = new BulkRequest("kun_index");
ArrayList<User> arr = new ArrayList<>();
arr.add(new User("kun01","desc"));
arr.add(new User("kun02","desc"));
arr.add(new User("kun03","desc"));
arr.add(new User("kun04","desc"));
arr.add(new User("kun05","desc"));
arr.add(new User("kun06","desc"));
for (int i=1;i<arr.size();i++){
bulk.add(new IndexRequest("kun_index")
.id(i+"") //指定id,不加是随机id
.source(JSON.toJSONString(arr.get(i-1)),XContentType.JSON));
}
BulkResponse cliBlk = client.bulk(bulk, RequestOptions.DEFAULT);
System.out.println(cliBlk.hasFailures());//是否失败,false代表成功
}
@Test
void test10() throws IOException {
SearchRequest searchRequest = new SearchRequest(Es.es_index);
//构建搜索条件
SearchSourceBuilder builder = new SearchSourceBuilder();
//builder.highlighter();//高亮
//QueryBuilders.termQuery精确查找
//QueryBuilders.matchAllQuery()匹配所有
//分页
builder.from(0);
builder.size(10);
TermQueryBuilder termQueryBuilder = QueryBuilders.termQuery("name", "kun01");
builder.query(termQueryBuilder);
builder.timeout(new TimeValue(60,TimeUnit.SECONDS));
searchRequest.source(builder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
System.out.println(search);
System.out.println(search.getHits());
System.out.println("====================");
for (SearchHit s:search.getHits().getHits()){
System.out.println(s.getSourceAsMap());
}
}
}
高亮展示
package com.example.demo02.servlet;
import com.alibaba.fastjson.JSON;
import com.example.demo02.pojo.Content;
import com.example.demo02.util.JsoupUtil;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
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.text.Text;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightBuilder;
import org.elasticsearch.search.fetch.subphase.highlight.HighlightField;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Service
public class ContentServlet {
@Autowired
@Qualifier("RestHighLevelClient")
private RestHighLevelClient client;
public boolean add(String keyword) throws IOException {
BulkRequest bulk = new BulkRequest("kun_index");
bulk.timeout("2m");
final List<Content> arr = JsoupUtil.getJsoupData(keyword);
for (int i=1;i<arr.size();i++){
bulk.add(new IndexRequest("jd_goods")
.id(i+"") //指定id,不加是随机id
.source(JSON.toJSONString(arr.get(i-1)), XContentType.JSON));
}
BulkResponse cliBlk = client.bulk(bulk, RequestOptions.DEFAULT);
return !cliBlk.hasFailures();//是否失败,false代表成功
}
public List<Map> search(String keyword, int pageNo, int pageSize) throws IOException {
SearchRequest searchRequest = new SearchRequest("jd_goods");
SearchSourceBuilder builder = new SearchSourceBuilder();
//分页
builder.from(pageNo);
builder.size(pageSize);
builder.timeout(new TimeValue(60, TimeUnit.SECONDS));
// TermQueryBuilder title = QueryBuilders.termQuery("title", keyword);
//多个高亮显示
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
boolQueryBuilder.should(QueryBuilders.matchQuery("title",keyword));
boolQueryBuilder.should(QueryBuilders.matchQuery("price","java124"));
builder.query(boolQueryBuilder);
//设置高亮
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.requireFieldMatch(true);//多个高亮显示
highlightBuilder.field("title").field("price").preTags("<span style='color:red'>").postTags("</span>");
builder.highlighter(highlightBuilder);
searchRequest.source(builder);
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
ArrayList<Map> list = new ArrayList<>();
for(SearchHit s:search.getHits().getHits()){
//------------------------------------------
Map<String, HighlightField> highlightFields = s.getHighlightFields();
HighlightField titleH = highlightFields.get("title");
HighlightField priceH = highlightFields.get("price");
Map<String, Object> sourceAsMap = s.getSourceAsMap();//原来的结果
if(titleH!=null){
Text[] fragments = titleH.fragments();
String n_title="";
for(Text text:fragments){
n_title+=text;
}
//高亮字段替换原来字段
sourceAsMap.put("title",n_title);
}
if(priceH!=null){
Text[] fragments = priceH.fragments();
String n_price="";
for(Text text:fragments){
n_price+=text;
}
//高亮字段替换原来字段
sourceAsMap.put("price",n_price);
}
//------------------------------------------
list.add(s.getSourceAsMap());
}
return list;
}
}