Relational DB -> Databases -> Tables -> Rows -> Columns
Elasticsearch -> Indices -> Types -> Documents -> Fields
Es
ik分詞器與Es集成 查詢方式:0)id 1) trim 2) query_string
安裝 Es 將IK 解壓後的ElasticSearch 文件夾放到 Es 中 Plugin 裏
ik分詞器使用時 在請求路徑下 添加參數 ?analyzer=ik_smart&text=交友網站
Es 原生api
<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.11.2</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>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.8.1</version>
</dependency>
</dependencies>
public class ElasticSearchClientTest {
private TransportClient client;
@Before
public void init() throws Exception {
//1.創建一個settings對象,相當於是是配置信息
Settings builder = Settings.builder()
.put("cluster.name", "my-elasticsearch").build();
//2.創建一個客戶端對象
client = new PreBuiltTransportClient(builder);
client.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("127.0.0.1"), 9300)
);
}
//創建索引庫
@Test
public void createIndex() throws UnknownHostException {
client.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("127.0.0.1"), 9301)
);
//3.創建client對象創建一個索引庫
client.admin().indices().prepareCreate("index-hello1")
//執行操作
.get();
//4.關閉client
client.close();
}
//使用java客戶端設置mapping
@Test
public void setMappings() throws Exception {
client.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("127.0.0.1"), 9300)
);
client.addTransportAddress(new InetSocketTransportAddress(
InetAddress.getByName("127.0.0.1"), 9301)
);
//創建一個Mappings信息
XContentBuilder builders = XContentFactory.jsonBuilder()
.startObject() //{
.startObject("article")
.startObject("properties")
.startObject("id")
.field("type", "integer").field("store", "yes")
.endObject()
.startObject("title")
.field("type", "string").field("store", "yes").field("analyzer", "ik_smart")
.endObject()
.startObject("content")
.field("type", "string").field("store", "yes").field("analyzer", "ik_smart")
.endObject()
.endObject()
.endObject()//}
.endObject();
// 創建映射
/* PutMappingRequest mapping = Requests.putMappingRequest("index-hello")
.type("article").source(builders);
client.admin().indices().putMapping(mapping).get();*/
client.admin().indices().
//設置要映射的索引
preparePutMapping("index-hello1")
//設置要做映射的type
.setType("article")
//mapping信息,可以是XContentBuilder對象可以是json格式的字符串
.setSource(builders)
.get();
//釋放資源
client.close();
}
//添加文檔
/*
步驟:
1>創建一個Settings對象
2>創建一個Client對象
3>創建一個文檔對象,創建一個json格式的字符串或者使用XContertBuilder
4>使用client對象添加到索引庫中
*/
@Test
public void testAddDocument() throws Exception {
//創建一個client對象
//創建一個文檔對象
XContentBuilder builder = XContentFactory.jsonBuilder()
.startObject()
.field("id", 1)
.field("title", "ElasticSearch是一個基於Lucene的搜索服務器")
.field("content",
"它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並作爲Apache許可條款下的開放源碼發佈,是當前流行的企業級搜索引擎。設計用於雲計算中,能夠達到實時搜索,穩定,可靠,快速,安裝使用方便。")
.endObject();
//把文檔對象添加到索引庫
client.prepareIndex().setIndex("index-hello1")
// 設置索引名稱
.setType("article")
.setId("1")
//執行文檔信息
.setSource(builder)
//執行操作
.get();
}
@Test
public void testAddDocument2() throws JsonProcessingException {
//創建一個article對象
Article article = new Article();
//設置對象的屬性
article.setId(2l);
article.setTitle("逃不過不放手");
article.setContent("化工太難過哈哈哈哈哈");
//將Article對象轉換爲json格式的字符串,或者使用XContentBuilder
ObjectMapper objectMapper = new ObjectMapper();
String jsonDoc = objectMapper.writeValueAsString(article);
System.out.println(jsonDoc);
//使用Client對象吧文檔添加到索引庫中
client.prepareIndex("index-hello1", "article", "2").setSource(jsonDoc, XContentType.JSON).get();
//關閉client
client.close();
}
//實現搜索,
//1. 根據id搜索,
//2.根據term(關鍵詞)進行查詢
//3.QueryString查詢方式(帶分析的查詢)
/*
創建一個client對象
創建一個查詢對象,可以使用QueryBuilds工具類
使用client執行查詢
*/
@Test
public void testSearchById() throws Exception {
//創建一個client對象
//創建一個查詢對象根據id查詢,可以查詢多個id
QueryBuilder queryBuilder = QueryBuilders.idsQuery().addIds("1", "2");
//執行查詢 ↓ 可抽取爲一個方法 search(queryBuilder)
SearchResponse searchBuilder = client.prepareSearch("index-hello1").setTypes("article").setQuery(queryBuilder).get();
//取查詢結果
SearchHits searchHits = searchBuilder.getHits();
//取查詢結果的總記錄數
System.out.println("查詢結果總記錄數" + searchHits.getTotalHits());
//查詢結果列表
Iterator<SearchHit> iterator = searchHits.iterator();
while (iterator.hasNext()) {
SearchHit searchHit = iterator.next();
String sourceAsString = searchHit.getSourceAsString();
//打印文檔json對象
System.out.println(sourceAsString);
//文檔的屬性
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"));
}
//關閉client
client.close();
}
//utils 提取search
private void search(QueryBuilder queryBuilder) throws Exception {
//執行查詢
SearchResponse searchBuilder = client.prepareSearch("index-hello1")
.setTypes("article").setQuery(queryBuilder)
//設置分頁信息
.setFrom(0)
.setSize(5)
.get();
//取查詢結果
SearchHits searchHits = searchBuilder.getHits();
//取查詢結果的總記錄數
System.out.println("拆查詢結果總記錄數" + searchHits.getTotalHits());
//查詢結果列表
Iterator<SearchHit> iterator = searchHits.iterator();
while (iterator.hasNext()) {
SearchHit searchHit = iterator.next();
String sourceAsString = searchHit.getSourceAsString();
//打印文檔對象
System.out.println("文檔對象的json形式:" + sourceAsString);
//文檔的屬性
System.out.println("-----文檔的屬性----------");
Map<String, Object> document = searchHit.getSource();
System.out.println("id--->"+document.get("id"));
System.out.println("title--->"+document.get("title"));
System.out.println("content--->"+document.get("content"));
}
//關閉client
client.close();
}
//根據term查詢
@Test
public void testQueryByTerm() throws Exception {
//創建一個queryBuild
//1.搜索字段,搜索關鍵詞
TermQueryBuilder queryBuilder = QueryBuilders.termQuery("title", "放手");
//使用search 執行查詢,傳入queryBuilder
search(queryBuilder);
}
@Test
public void testQueryStringQuery() throws Exception {
//創建一個QueryBuilder對象
QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("哈哈").defaultField("content");
search(queryBuilder);
}
//分頁數據
//在執行查詢之前,設置分頁就行,使用設置高亮的search方法
@Test
public void testQueryStringQueryPage() throws Exception {
QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery("哈哈").defaultField("content");
search(queryBuilder, "content");
}
/**
* 高亮顯示
* @throws JsonProcessingException
*/
private void search(QueryBuilder queryBuilder, String highlight) throws Exception {
HighlightBuilder highlightBuilder = new HighlightBuilder();
highlightBuilder.field(highlight);
highlightBuilder.preTags("<em>");
highlightBuilder.postTags("</em>");
//執行查詢
SearchResponse searchBuilder = client.prepareSearch("index-hello").setTypes("article").setQuery(queryBuilder)
//設置分頁信息
.setFrom(0)
.setSize(5)
//高亮顯示
.highlighter(highlightBuilder)
.get();
//取查詢結果
SearchHits searchHits = searchBuilder.getHits();
//取查詢結果的總記錄數
System.out.println("查詢結果總記錄數" + searchHits.getTotalHits());
System.out.println("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++");
//查詢結果列表
Iterator<SearchHit> iterator = searchHits.iterator();
while (iterator.hasNext()) {
SearchHit searchHit = iterator.next();
String sourceAsString = searchHit.getSourceAsString();
//打印文檔對象
System.out.println("文檔的json格式:-->"+sourceAsString);
//文檔的屬性
System.out.println("-----文檔的屬性");
Map<String, Object> document = searchHit.getSource();
System.out.println("id:"+document.get("id"));
System.out.println("title:"+document.get("title"));
System.out.println("content:"+document.get("content"));
Map<String, HighlightField> highlightFields = searchHit.getHighlightFields();
System.out.println("*****高亮結果******"+highlightFields); //獲取的是一個k,v格式的map k爲查詢的字段 v爲高亮後的內容
//取高亮顯示的結果
HighlightField field = highlightFields.get(highlight);
Text[] fragments = field.getFragments(); //高亮顯示的片段
if (fragments != null) {
String title = fragments[0].toString();
System.out.println("高亮結果後的:" + title);
System.out.println("++++++++++++++++++++++++++++++++++++++++");
}
}
//關閉client
client.close();
}
//批量添加數據
@Test
public void testAddDocument3() throws JsonProcessingException {
//創建一個article對象
Article article = new Article();
for (int i = 4; i < 100; i++) {
//設置對象的屬性
article.setId(i);
article.setTitle("逃不過不放手" + i);
article.setContent("化工太難過哈哈哈哈哈" + i);
//將Article對象轉換爲json格式的字符串,或者使用XContentBuilder
ObjectMapper objectMapper = new ObjectMapper();
String jsonDoc = objectMapper.writeValueAsString(article);
System.out.println(jsonDoc);
//使用Client對象吧文檔添加到索引庫中
client.prepareIndex("index-hello1", "article", i + "").setSource(jsonDoc, XContentType.JSON).get();
}
//關閉client
client.close();
}
}
public class Article {
private long id;
private String title;
private String content;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
}
``