Elasticsearch基礎

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"將不做分詞查詢

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章