初識elasticsearch-正向索引和倒排索引
什么是文檔和詞條?
每一條數(shù)據(jù)就是一個文檔
對文檔中的內(nèi)容分詞,得到的詞語就是詞條
elasticsearch就是面對文檔存儲的,可以是數(shù)據(jù)庫中的一條商品數(shù)據(jù),一個訂單信息,文檔數(shù)據(jù)會被反序列化為json格式后存儲在elasticsearch中。
什么是正向索引?
基于文檔id創(chuàng)建索引。查詢詞條時必須先找到文檔,而后判斷是否包含詞條
什么是倒排索引?
對文檔內(nèi)容分詞,對詞條創(chuàng)建索引,并記錄詞條所在文檔信息。查詢是現(xiàn)根據(jù)詞條查詢到文檔id,而后獲取到文檔。
例子:id= 1 ,title = 華為小米充電器 id = 2,title = 小米手環(huán)
生成詞條 文檔id = 1 詞條term= 華為 文檔id = 1,2 詞條term= 小米
通過詞條查詢文檔id,在查詢到文檔
索引(Index):
索引(index):相同類型的文檔的集合(有種mysql數(shù)據(jù)庫的表(table)的感覺)
映射(mapping):索引中文檔的字段約束信息,類似表的結(jié)構(gòu)約束(類似于表的字段類型約束表結(jié)構(gòu)(schema))
文檔(Document):就是一條條的數(shù)據(jù),類似數(shù)據(jù)庫中的行(Row),文檔都是json格式
字段(Filed):就是JSON文檔中的字段,類似數(shù)據(jù)庫中的列(Column)
請求語句(DSL):提供的JSON風格的請求語句,用來操作elasticsearch,實現(xiàn)CRUD
區(qū)別:mysql擅長事務類型操作,可以確保數(shù)據(jù)的安全和一致性
elasticsearch擅長數(shù)據(jù)的搜索、分析、計算
分詞器:
1、分詞器作用:
創(chuàng)建倒排索引時對文檔分詞
用戶搜索時,對輸入的內(nèi)容分詞
2、IK分詞器有幾種模式:
ik_smart :智能切分,粗粒度
ik_max_word:最細切分,細粒度
3、IK分詞器如何擴展詞條,如何停用詞條
利用config目錄的ikAnalyzer.cfg.xml文件添加擴展詞典和停用詞典
在詞典中添加擴展詞條或者停用詞條
索引常見mapping屬性:
type:字段數(shù)據(jù)類型,常見的簡單類型有:
字符串:text(可分詞的文本) 、 keyword(精確值,例如國家、品牌等不可拆)
數(shù)值:long、integer、short、byte、double、float、
布爾:boolean
日期:date
對象:object
index:是否創(chuàng)建索引,默認為true
analyzer:使用哪種分詞器
properties:該字段的子字段
創(chuàng)建索引庫:
es中通過Restful請求操作索引庫、文檔。請求內(nèi)容用DSL語句來表示。創(chuàng)建索引庫和mapping的DSL語法如下:
PUT /example
{
"mappings": {
"properties": {
"class":{
"type":"text",
"analyzer":"ik_smart"
},
"cources":{
"type":"keyword",
"index":"false"
},
"name":{
"properties":{
"firstName": {
"type":"keyword"
}
}
},
//略
}}}
查看、刪除索引庫:
查看索引庫:get /索引庫名
刪除索引庫:delete /索引庫名
索引庫和mapping一旦創(chuàng)建無法修改,但是可以添加新的字段:
put /索引庫名/_mapping
{
"properties": {
"新字段名":{
"type":"integer"
}
}
}
文檔操作:
添加文檔:
新增文檔DSL語法:
POST /索引庫名/_doc/文檔id
{
"字段1:"值1",
"字段2":{
"子屬性1":"值2",
"子屬性2":"值3"
},
// ...
}
刪除文檔的語法:
DELETE /索引庫名/_doc/文檔id
修改文檔
方式一:全量修改,會刪除舊文檔,添加新文檔
PUT /索引庫名/_doc/文檔id
{
"字段1:"值1",
"字段2":{
"子屬性1":"值2",
"子屬性2":"值3"
},
// ...
}
方法二:增量修改,修改指定字段值
POST /索引庫名._update/文檔id
{
"doc": {
"字段名": "新的值",
}
}
RestClient操作索引庫:
es提供了各種不同語言的客戶端,這些客戶端本質(zhì)就是組裝DSL,通過http請求發(fā)送給es
創(chuàng)建索引庫
private RestHighLevelClient client;
@BeforeEach
void setUp(){
this.client = new RestHighLevelClient(RestClient.builder(
HttpHost.create("http://192.168.0.1:9200")
));
}
@AfterEach
void tearDown() throws IOException {
client.close();
}
@Test
void testCreateHotelIndex() throws IOException {
//1、創(chuàng)建Request對象 (請求路徑,索引庫名稱)
CreateIndexRequest request = new CreateIndexRequest("hotel");
//2、請求參數(shù),MAPPING_TEMPLATE是靜態(tài)常量字符串,內(nèi)容是創(chuàng)建索引庫的DSL語句
request.source(MAPPING_TEMPLATE,XContentType.JSON);
//3、發(fā)起請求
client.indices().create(request,RequstOptions.DEFAULT);
}
刪除索引庫文章來源:http://www.zghlxwxcb.cn/news/detail-712596.html
@Test
void testDeleteHotelIndex() throws IOException {
//1、創(chuàng)建Request對象 (請求路徑,索引庫名稱)
DeleteIndexRequest request = new CreateIndexRequest("hotel");
GetIndexRequest requestExist = new CreateIndexRequest("hotel");
//刪除索引庫
client.indices().delete(request,RequstOptions.DEFAULT);
//判斷是否存在索引庫
boolean exist = client.indices().exists(requestExist ,RequstOptions.DEFAULT);
}
RestCient 操作文檔:文章來源地址http://www.zghlxwxcb.cn/news/detail-712596.html
添加酒店數(shù)據(jù)到索引庫
@Test
void testIndexDocument() throws IOException {
//1、創(chuàng)建Request對象 (索引庫名稱,id)
IndexRequest request = new IndexRequest("indexName").id("1");
//準備json文檔
request.source("{\"name\":\"Jack\",\"age\":21}".XContentType.JSON);
//3、發(fā)送請求
client.index(request,RequestOptions.DEFAULT);
}
到了這里,關(guān)于關(guān)于elasticsearch與kibana、IK分詞器的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!