1.存儲結構
Elasticsearch是文件存儲,Elasticsearch是面向文檔型數據庫,一條數據在這裏就是一個文檔,用JSON作爲文檔序列化的格式,比如這樣:
{
"name" : "xiaoming",
"age" : 0
}
關係型數據庫:
數據庫(會員數據庫) ——> 表(用戶表) ——>行 ——> 列(Columns)
Elasticsearch:
索引(Index) ——> 類型(type) ——>文檔 (Documents)——> 字段(Fields)
2.安裝Elasticsearch及kibana
需要jdk環境,並且運行會佔用1G內存
不允許root用戶啓動es,默認外部不能訪問,訪問地址爲 IP:9200
其餘問題自行百度
kibana版本要與es一致
修改config下文件,解放server.port,修改server.host爲本機IP,解放並修改elasticsearch.hosts爲es地址
訪問地址爲 IP:5601
3.es基礎語法
在kibana主頁切換到dev tools
# 刪除索引
DELETE /mymayikt
# 新建索引
PUT /mymayikt
# 獲取索引
GET /mymayikt
# 建立文檔 /索引/類型/id
PUT /mymayikt/user/9
{
"name":"mooyt",
"age":20,
"sex":0
}
GET /mymayikt/user/4
# 不傳入id的情況
POST /mymayikt/user/
{
"name":"ma",
"age":215,
"sex":0
}
GET /mymayikt/user/6-18PWkB8UeMF1fSscek
# 查詢所有
GET /mymayikt/user/_search
# 查詢指定id
GET /mymayikt/user/_mget
{
"ids":[1,4]
}
# 條件查詢
GET /mymayikt/user/_search?q=age:1
# 條件查詢
GET /mymayikt/user/_search?q=age:[10 TO 60]&sort=age:desc
# 分頁,從第0到第二條數據
GET /mymayikt/user/_search?from=0&size=2
# term爲精確查詢
# 模糊查詢 支持分詞
GET mymayikt/user/_search
{
"from": 0,
"size": 2,
"query": {
"match": {
"name":"mooyt"
}
}
}
4.springboot整合es
4.1簡單案例
創建springboot項目,創建實體類UserEntity
@Document(indexName="mymayikt",type="user")
@Data
public class UserEntity {
@Id
private String id;
private String name;
private Integer age;
private Integer sex;
}
創建UserDao類,這裏直接繼承JPA
@Repository
public interface UserDao extends CrudRepository<UserEntity,String> {
}
創建UserController類
@RestController
public class UserController {
@Autowired
private UserDao userDao;
@RequestMapping("/addUser")
public UserEntity addUser(@RequestBody UserEntity userEntity) {
return userDao.save(userEntity);
}
//查詢文檔
@RequestMapping("/findById")
public Optional<UserEntity> findById(String id) {
return userDao.findById(id);
}
}
前臺頁面index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/addUser" datatype="">
d
<input name="id">
<input name="name">
<input name="sex">
<input name="age">
<input type="submit" value="dian">
</form>
</body>
</html>
application.properties配置文件
spring.data.elasticsearch.cluster-name=yourname
spring.data.elasticsearch.cluster-nodes=yourIP:9300
spring.http.encoding.charset=UTF-8
server.port=8080
利用Postman測試
http://localhost:8080/addUser 寫入json
{
"id":2,
"name":"lis2",
"sex":0,
"age":2
}
在kibana中查詢
GET mymayikt/user/2
得到以下結果:
{
"_index" : "mymayikt",
"_type" : "user",
"_id" : "2",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 3,
"found" : true,
"_source" : {
"id" : "2",
"name" : "lis2",
"age" : 2,
"sex" : 0
}
}
利用Postman查詢
http://localhost:8080/findById?id=2 得到
{
"id": "2",
"name": "lis2",
"age": 2,
"sex": 0
}
查詢成功!
4.2 手動模擬數據案例
創建實體類EsBlog
@Document(indexName = "blog" ,type = "blog")
@Data
public class EsBlog implements Serializable {
@Id
private String id;
private String title;
private String summary;
private String content;
}
創建數據操作類EsBlogRepository
@Repository
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog,String> {
Page<EsBlog> findByTitleLikeOrContentLike(String title, String summary,String content, Pageable pageable);
}
編寫測試用例
@RunWith(SpringRunner.class)
@SpringBootTest
public class Elasticsearch02ApplicationTests {
@Autowired
private EsBlogRepository es;
@Before
public void initRepository() {
es.deleteAll();
es.save(new EsBlog("額誒誒", "跌名", "eee,xxxtg,bmfls,hzbqqb"));
es.save(new EsBlog("額誒", "名", "g,bmfls,hzbqqb"));
es.save(new EsBlog("額", "跌", "eee,,bmfls,hzbqqb"));
es.save(new EsBlog("誒", "跌名", "eee,xxxtg,bmfls,hzbqqb"));
es.save(new EsBlog("誒誒", "跌名", "hzbqqb"));
es.save(new EsBlog("額s", "跌", "e產品特別圖片圖片"));
es.save(new EsBlog("算法", "java", "eee這是應該的"));
}
@Test
public void findByTitleLikeOrContentLike() {
Pageable pageable = PageRequest.of(0, 20);
String title = "額";
String summary = "跌";
String content = "eee";
Page<EsBlog> page = es.findByTitleLikeOrContentLike(title, summary, content, pageable);
System.out.println("----------------");
for (EsBlog blog : page.getContent()) {
System.out.println(blog.toString());
}
}
}
查詢結果類似這樣
EsBlog{id='NFWR5mkB3Hevp7XrnNWm', title='額s', summary='跌', content='e產品特別圖片圖片'}
EsBlog{id='MFWR5mkB3Hevp7XrnNVM', title='額誒', summary='名', content='g,bmfls,hzbqqb'}
EsBlog{id='L1WR5mkB3Hevp7XrnNUc', title='額誒誒', summary='跌名', content='eee,xxxtg,bmfls,hzbqqb'}
EsBlog{id='MVWR5mkB3Hevp7XrnNVh', title='額', summary='跌', content='eee,,bmfls,hzbqqb'}
定義BlogController類
@RestController
@RequestMapping("/blogs")
public class BlogController {
@Autowired
private EsBlogRepository es;
@RequestMapping("/list")
public List<EsBlog> list(@RequestParam(value = "title")String title ,
@RequestParam(value = "summary")String summary ,
@RequestParam(value = "content")String content ,
@RequestParam(value = "pageIndex",defaultValue = "0")int pageIndex ,
@RequestParam(value = "pageSize",defaultValue = "10")int pageSize){
//數據在test初始化
Pageable pageable = PageRequest.of(pageIndex, pageSize);
Page<EsBlog> page = es.findByTitleLikeOrContentLike(title, summary,content, pageable);
return page.getContent();
}
}
啓動並訪問
http://localhost:8080/blogs/list?title=%E9%A2%9D&summary=eee&content=eee
返回結果類似這樣
[
{
"id": "L1WR5mkB3Hevp7XrnNUc",
"title": "額誒誒",
"summary": "跌名",
"content": "eee,xxxtg,bmfls,hzbqqb"
},
{
"id": "MVWR5mkB3Hevp7XrnNVh",
"title": "額",
"summary": "跌",
"content": "eee,,bmfls,hzbqqb"
},
{
"id": "NFWR5mkB3Hevp7XrnNWm",
"title": "額s",
"summary": "跌",
"content": "e產品特別圖片圖片"
},
]
5.9200與9300端口號區別
9200端口號暴露es restful接口
利用es提供的restful接口查詢
http://ip:9200/mymayikt/user/2
{"_index":"mymayikt","_type":"user","_id":"2","_version":1,"_seq_no":0,"_primary_term":3,"found":true,"_source":{"id":"2","name":"lis2","age":2,"sex":0}}
9300是TCP協議端口號,es集羣之間通訊端口號
6.中文分詞器
6.1分詞器設置
下載與版本對應的分詞器
解壓到es/plugins下命名爲ik,重啓即可
利用Postman發送到 http://ip:9200/_analyze
{
"analyzer":"ik_smart",
"text":"絕地求生"
}
返回數據爲
{
"tokens": [
{
"token": "絕地求生",
"start_offset": 0,
"end_offset": 4,
"type": "CN_WORD",
"position": 0
}
]
}
6.2.分詞器的擴展
停掉es
到es/plugins/ik/config目錄下
mkdir dic
cd dic
vim new_word.dic
何以解憂
cd ..
vim IKAnalyzer.cfg.xml
<entry key="ext_dict">dic/new_word.dic</entry>
啓動服務
利用Postman發送到 http://ip:9200/_analyze
{
"analyzer":"ik_smart",
"text":"何以解憂"
}
返回數據爲
{
"tokens": [
{
"token": "何以解憂",
"start_offset": 0,
"end_offset": 4,
"type": "CN_WORD",
"position": 0
}
]
}
7.指定文檔映射類型
指定age爲integer類型,name爲text類型
DELETE /mymayikt
PUT /mymayikt
# 指定類型
POST /mymayikt/_mapping/user
{
"user" : {
"properties" : {
"age" : {
"type" : "integer"
},
"name" : {
"type" : "text"
"analyzer" : "ik_smart"
}
}
}
}
PUT mymayikt/user/1
{
"name":"好好學習",
"age":"1"
}
PUT mymayikt/user/2
{
"name":"華爲p10",
"age":"1"
}
PUT mymayikt/user/3
{
"name":"撒播",
"age":"1"
}
# 查詢
GET mymayikt/user/_search
{
"from": 0,
"size": 2,
"query": {
"match": {
"name":"華爲"
}
}
}
"type" : "keyword"將不做分詞查詢