建設(shè)和住房委員會(huì)官方網(wǎng)站谷歌推廣效果怎么樣
文章目錄
- 00. 數(shù)據(jù)準(zhǔn)備
- 01. ElasticSearch 結(jié)構(gòu)化搜索是什么?
- 02. ElasticSearch 結(jié)構(gòu)化搜索方式有哪些?
- 03. ElasticSearch 全文搜索方式有哪些?
- 04. ElasticSearch term 查詢數(shù)字?
- 05. ElasticSearch term 查詢會(huì)不會(huì)計(jì)算評(píng)分?
- 06. ElasticSearch term 查詢?yōu)槭裁磿?huì)返回一個(gè)評(píng)分?
- 07. ElasticSearch 字符串類型 text?
- 08. ElasticSearch 字符串類型 keyword?
- 09. ElasticSearch term 查詢字符串?
- 10. SpringBoot整合ES實(shí)現(xiàn)term查詢?
- 11. TermQueryBuilder 源碼
00. 數(shù)據(jù)準(zhǔn)備
PUT /my_index
{"mappings": {"properties": {"title": {"type": "keyword"},"content": {"type": "text"},"price":{"type": "long"}}}
}
PUT /my_index/_doc/1
{"title": "金都時(shí)尚情侶浪漫主題酒店","content": "山東省青島市","price": 337
}PUT /my_index/_doc/2
{"title": "金都嘉怡假日酒店","content": "北京市","price": 337
}PUT /my_index/_doc/3
{"title": "金都欣欣24小時(shí)酒店","content": "安徽省淮北市","price": 200
}PUT /my_index/_doc/4
{"title": "金都自如酒店","content": "上海直轄市","price": 300
}PUT /my_index/_doc/5
{"title": "自如酒店","content": "江蘇省南京市","price": 400
}
01. ElasticSearch 結(jié)構(gòu)化搜索是什么?
ElasticSearch 的結(jié)構(gòu)化搜索是一種基于數(shù)據(jù)結(jié)構(gòu)的搜索方式,它可以根據(jù)數(shù)據(jù)的字段進(jìn)行過濾、排序、聚合等操作,從而精確地查詢數(shù)據(jù)。比如日期、時(shí)間和數(shù)字都是結(jié)構(gòu)化的:它們有精確的格式,我們可以對(duì)這些格式進(jìn)行邏輯操作。比較常見的操作包括比較數(shù)字或時(shí)間的范圍,或判定兩個(gè)值的大小。文本也可以是結(jié)構(gòu)化的。如彩色筆可以有離散的顏色集合: 紅 、 綠、藍(lán) 。電商網(wǎng)站上的商品都有 UPCs 或其他的唯一標(biāo)識(shí),它們都需要遵從嚴(yán)格規(guī)定的、結(jié)構(gòu)化的格式。
在結(jié)構(gòu)化查詢中,我們得到的結(jié)果總是非是即否,要么存于集合之中,要么存在集合之外。**結(jié)構(gòu)化查詢不關(guān)心文件的相關(guān)度或評(píng)分,它簡單的對(duì)文檔包括或排除處理。**這在邏輯上是能說通的,因?yàn)橐粋€(gè)數(shù)字不能比其他數(shù)字更適合存于某個(gè)相同范圍。結(jié)果只能是:存于范圍之中,抑或反之。同樣,對(duì)于結(jié)構(gòu)化文本來說,一個(gè)值要么相等,要么不等。沒有更似這種概念。
02. ElasticSearch 結(jié)構(gòu)化搜索方式有哪些?
ElasticSearch 提供了多種結(jié)構(gòu)化搜索方式,包括:
① 精確值查詢:可以通過指定字段名和字段值來精確匹配數(shù)據(jù),例如查詢所有 age 字段等于 30 的文檔。
② 范圍查詢:可以通過指定字段名和范圍條件來查詢數(shù)據(jù),例如查詢所有 age 字段大于等于 30 小于等于 40 的文檔。
③ 模糊查詢:可以通過指定字段名和模糊匹配條件來查詢數(shù)據(jù),例如查詢所有 name 字段包含 “john” 的文檔。
④ 布爾查詢:可以通過組合多個(gè)查詢條件來查詢數(shù)據(jù),例如查詢所有 age 字段大于等于 30 并且 name 字段包含 “john” 的文檔。
⑤ 聚合查詢:可以對(duì)查詢結(jié)果進(jìn)行聚合操作,例如對(duì)所有 age 字段進(jìn)行平均值計(jì)算。
⑥ 排序查詢:可以通過指定字段名和排序方式來對(duì)查詢結(jié)果進(jìn)行排序,例如按照 age 字段升序排序。
⑦ 分頁查詢:可以通過指定查詢結(jié)果的起始位置和數(shù)量來進(jìn)行分頁查詢,例如查詢第 10 到第 20 條數(shù)據(jù)。
以上是 ElasticSearch 常用的結(jié)構(gòu)化搜索方式,可以根據(jù)具體的查詢需求選擇合適的方式來進(jìn)行查詢。
03. ElasticSearch 全文搜索方式有哪些?
ElasticSearch 提供了多種全文搜索方式,包括:
① 匹配查詢:可以通過指定字段名和查詢關(guān)鍵詞來進(jìn)行全文匹配查詢,例如查詢所有包含 “apple” 關(guān)鍵詞的文檔。
② 多字段查詢:可以同時(shí)在多個(gè)字段中進(jìn)行全文匹配查詢,例如查詢所有包含 “apple” 關(guān)鍵詞的 title 和 content 字段的文檔。
③ 短語匹配查詢:可以通過指定字段名和短語關(guān)鍵詞來進(jìn)行短語匹配查詢,例如查詢所有包含 “apple pie” 短語的文檔。
④ 前綴匹配查詢:可以通過指定字段名和前綴關(guān)鍵詞來進(jìn)行前綴匹配查詢,例如查詢所有以 “app” 開頭的文檔。
⑤ 正則表達(dá)式查詢:可以通過指定字段名和正則表達(dá)式來進(jìn)行正則匹配查詢,例如查詢所有 content 字段中包含數(shù)字的文檔。
⑥ 模糊查詢:可以通過指定字段名和模糊匹配條件來進(jìn)行模糊匹配查詢,例如查詢所有 content 字段中包含 “appl” 的文檔。
⑦ 搜索建議:可以根據(jù)用戶輸入的關(guān)鍵詞提供搜索建議,例如輸入 “app” 后自動(dòng)提示 “apple”。
以上是 ElasticSearch 常用的全文搜索方式,可以根據(jù)具體的查詢需求選擇合適的方式來進(jìn)行查詢。
04. ElasticSearch term 查詢數(shù)字?
在 ElasticSearch 中,term 查詢是一種用于查找指定字段中包含指定值的文檔的查詢方式。term 查詢是一種精確匹配查詢,它會(huì)精確地匹配指定字段中的值,不會(huì)對(duì)查詢關(guān)鍵詞進(jìn)行分詞處理。term 查詢可以用它處理數(shù)字、布爾值、日期以及字符串。
當(dāng)進(jìn)行精確值查找時(shí), 我們會(huì)使用過濾器(filters),過濾器很重要,因?yàn)樗鼈儓?zhí)行速度非???#xff0c;不會(huì)計(jì)算相關(guān)度(直接跳過了整個(gè)評(píng)分階段)而且很容易被緩存。
GET /my_index/_search
{"query": {"term": {"price": {"value": "337"}}}
}
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "my_index","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"title" : "金都時(shí)尚情侶浪漫主題酒店","content" : "山東省青島市","price" : 337}},{"_index" : "my_index","_type" : "_doc","_id" : "2","_score" : 1.0,"_source" : {"title" : "金都嘉怡假日酒店","content" : "北京市","price" : 337}}]}
}
上述查詢語句表示在 my_index 索引中查找 price字段中包含值為 “337” 的文檔。如果查詢成功,ElasticSearch 將返回所有符合條件的文檔。
需要注意的是,term 查詢是一種精確匹配查詢,它不會(huì)對(duì)查詢關(guān)鍵詞進(jìn)行分詞處理。因此,如果查詢關(guān)鍵詞包含多個(gè)單詞,term 查詢可能無法匹配到任何文檔。在這種情況下,可以考慮使用 match 查詢或者 phrase 查詢等其他查詢方式。
GET /my_index/_search
{"query": {"term": {"title": {"value": "金都時(shí)尚"}}}
}
{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 0,"relation" : "eq"},"max_score" : null,"hits" : [ ]}
}
05. ElasticSearch term 查詢會(huì)不會(huì)計(jì)算評(píng)分?
ElasticSearch 的 term 查詢不會(huì)計(jì)算評(píng)分,它是一種精確匹配查詢,只會(huì)返回精確匹配的文檔,不會(huì)對(duì)文檔進(jìn)行評(píng)分排序。
在 ElasticSearch 中,查詢語句可以分為兩種類型:查詢(query)和過濾器(filter)。查詢語句會(huì)對(duì)文檔進(jìn)行評(píng)分排序,而過濾器則不會(huì)對(duì)文檔進(jìn)行評(píng)分排序。term 查詢屬于過濾器類型的查詢語句,它只會(huì)返回精確匹配的文檔,不會(huì)對(duì)文檔進(jìn)行評(píng)分排序。
因此,如果需要對(duì)文檔進(jìn)行評(píng)分排序,可以使用查詢語句(如 match 查詢、bool 查詢等),如果只需要返回精確匹配的文檔,可以使用過濾器語句(如 term 查詢、range 查詢等)。
06. ElasticSearch term 查詢?yōu)槭裁磿?huì)返回一個(gè)評(píng)分?
在 ElasticSearch 中,雖然 term 查詢是一種過濾器類型的查詢語句,不會(huì)對(duì)文檔進(jìn)行評(píng)分排序,但是在某些情況下,term 查詢?nèi)匀粫?huì)返回一個(gè)評(píng)分。這是因?yàn)樵?ElasticSearch 中,每個(gè)文檔都有一個(gè) _score 屬性,表示該文檔與查詢條件的相關(guān)性得分。即使是過濾器類型的查詢語句,ElasticSearch 仍然會(huì)計(jì)算每個(gè)文檔與查詢條件的相關(guān)性得分,并將其存儲(chǔ)在 _score 屬性中。
在 term 查詢中,如果查詢條件只匹配了一個(gè)文檔,那么該文檔的 _score 屬性值將為 1.0,表示該文檔與查詢條件的相關(guān)性得分為最高。如果查詢條件匹配了多個(gè)文檔,那么所有匹配的文檔的 _score 屬性值都將為 1.0,表示它們與查詢條件的相關(guān)性得分相同。
雖然 term 查詢會(huì)返回一個(gè)評(píng)分,但是該評(píng)分并不會(huì)影響查詢結(jié)果的排序。在 term 查詢中,所有匹配的文檔的 _score 屬性值都相同,因此它們的排序順序?qū)⒏鶕?jù)其他因素(如文檔的創(chuàng)建時(shí)間、更新時(shí)間等)來確定。
GET /my_index/_search
{"query": {"term": {"price": {"value": "337"}}}
}
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 2,"relation" : "eq"},"max_score" : 1.0,"hits" : [{"_index" : "my_index","_type" : "_doc","_id" : "1","_score" : 1.0,"_source" : {"title" : "金都時(shí)尚情侶浪漫主題酒店","content" : "青島","price" : 337}},{"_index" : "my_index","_type" : "_doc","_id" : "2","_score" : 1.0,"_source" : {"title" : "金都嘉怡假日酒店","content" : "北京","price" : 337}}]}
}
07. ElasticSearch 字符串類型 text?
在 ElasticSearch 中,字符串類型 text 是一種用于存儲(chǔ)文本的數(shù)據(jù)類型。text 類型會(huì)對(duì)文本進(jìn)行分詞處理,將文本分成一個(gè)個(gè)詞條,然后將這些詞條存儲(chǔ)到倒排索引中,以便進(jìn)行全文搜索。
由于text 類型會(huì)對(duì)文本進(jìn)行分詞處理,因此在進(jìn)行查詢時(shí),需要使用全文搜索查詢方式(如 match 查詢、multi_match 查詢等),而不能使用精確匹配查詢方式(如 term 查詢、terms 查詢等)。
例如:根據(jù)我們構(gòu)造的數(shù)據(jù),content 字段為 text 類型,且數(shù)據(jù)庫中存在數(shù)據(jù):
PUT /my_index/_doc/1
{"title": "金都時(shí)尚情侶浪漫主題酒店","content": "山東省青島市","price": 337
}
① 使用精確匹配 term 查詢,查詢結(jié)果為空:
GET /my_index/_search
{"query": {"term": {"content": {"value": "山東省青島市"}}}
}
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 0,"relation" : "eq"},"max_score" : null,"hits" : [ ]}
}
② 使用全文檢索 match查詢,查詢結(jié)果為:
GET /my_index/_search
{"query": {"match": {"content": "山東省青島市"}}
}
{"took" : 4,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 5,"relation" : "eq"},"max_score" : 5.805786,"hits" : [{"_index" : "my_index","_type" : "_doc","_id" : "1","_score" : 5.805786,"_source" : {"title" : "金都時(shí)尚情侶浪漫主題酒店","content" : "山東省青島市","price" : 337}},{"_index" : "my_index","_type" : "_doc","_id" : "3","_score" : 0.5889417,"_source" : {"title" : "金都欣欣24小時(shí)酒店","content" : "安徽省淮北市","price" : 200}},{"_index" : "my_index","_type" : "_doc","_id" : "5","_score" : 0.5889417,"_source" : {"title" : "自如酒店","content" : "江蘇省南京市","price" : 400}},{"_index" : "my_index","_type" : "_doc","_id" : "2","_score" : 0.10522305,"_source" : {"title" : "金都嘉怡假日酒店","content" : "北京市","price" : 337}},{"_index" : "my_index","_type" : "_doc","_id" : "4","_score" : 0.08840232,"_source" : {"title" : "金都自如酒店","content" : "上海直轄市","price" : 300}}]}
}
因此,由于 text 類型會(huì)對(duì)文本進(jìn)行分詞處理,因此在進(jìn)行查詢時(shí),需要使用全文搜索查詢方式(如 match 查詢、multi_match 查詢等),而不能使用精確匹配查詢方式(如 term 查詢、terms 查詢等)。
08. ElasticSearch 字符串類型 keyword?
在 ElasticSearch 中,字符串類型 keyword 是一種用于存儲(chǔ)精確值的數(shù)據(jù)類型。keyword 類型不會(huì)對(duì)文本進(jìn)行分詞處理,而是將整個(gè)文本作為一個(gè)詞條進(jìn)行索引,以便進(jìn)行精確匹配查詢。
由于 keyword 類型不會(huì)對(duì)文本進(jìn)行分詞處理,因此在進(jìn)行查詢時(shí),需要使用精確匹配查詢方式(如 term 查詢、terms 查詢等),而不能使用全文搜索查詢方式(如 match 查詢、multi_match 查詢等)。
例如:根據(jù)我們構(gòu)造的數(shù)據(jù),title 字段為 keyword 類型,且數(shù)據(jù)庫中存在數(shù)據(jù):
PUT /my_index/_doc/1
{"title": "金都時(shí)尚情侶浪漫主題酒店","content": "山東省青島市","price": 337
}
使用精確匹配 term 查詢,查詢結(jié)果為:
GET /my_index/_search
{"query": {"term": {"title": {"value": "金都時(shí)尚情侶浪漫主題酒店"}}}
}
{"took" : 0,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.3862944,"hits" : [{"_index" : "my_index","_type" : "_doc","_id" : "1","_score" : 1.3862944,"_source" : {"title" : "金都時(shí)尚情侶浪漫主題酒店","content" : "山東省青島市","price" : 337}}]}
}
09. ElasticSearch term 查詢字符串?
在 ElasticSearch 中,term 查詢是一種用于精確匹配查詢的查詢方式,可以用于查詢 keyword 類型的文本。term 查詢會(huì)將查詢關(guān)鍵詞作為一個(gè)整體進(jìn)行匹配,只有當(dāng)查詢關(guān)鍵詞與文檔中的詞條完全匹配時(shí),才會(huì)返回匹配的文檔。
以下是一個(gè)使用 term 查詢進(jìn)行查詢的示例:
GET /my_index/_search
{"query": {"term": {"title": {"value": "金都時(shí)尚情侶浪漫主題酒店"}}}
}
使用 term 查詢對(duì)名為 “my_index” 的索引中的 “title” 字段進(jìn)行查詢,查詢關(guān)鍵詞為 “John Doe”。由于 “title” 字段的類型為 keyword,因此 term 查詢會(huì)將查詢關(guān)鍵詞作為一個(gè)整體進(jìn)行匹配,只有當(dāng)文檔中的 “title” 字段的值與查詢關(guān)鍵詞完全匹配時(shí),才會(huì)返回匹配的文檔。
由于 term 查詢是一種精確匹配查詢方式,因此在進(jìn)行查詢時(shí),需要確保查詢關(guān)鍵詞與文檔中的詞條完全匹配,否則可能會(huì)導(dǎo)致查詢結(jié)果不準(zhǔn)確。
{"took" : 1,"timed_out" : false,"_shards" : {"total" : 1,"successful" : 1,"skipped" : 0,"failed" : 0},"hits" : {"total" : {"value" : 1,"relation" : "eq"},"max_score" : 1.3862944,"hits" : [{"_index" : "my_index","_type" : "_doc","_id" : "1","_score" : 1.3862944,"_source" : {"title" : "金都時(shí)尚情侶浪漫主題酒店","content" : "山東省青島市","price" : 337}}]}
}
10. SpringBoot整合ES實(shí)現(xiàn)term查詢?
GET /my_index/_search
{"query": {"term": {"price": {"value": "337"}}}
}
@Slf4j
@Service
public class ElasticSearchImpl {@Autowiredprivate RestHighLevelClient restHighLevelClient;public void searchUser() throws IOException {SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();TermQueryBuilder termQueryBuilder = new TermQueryBuilder("price",337);searchSourceBuilder.query(termQueryBuilder);SearchRequest searchRequest = new SearchRequest(new String[]{"my_index"},searchSourceBuilder);SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);System.out.println(searchResponse);}
}
11. TermQueryBuilder 源碼
public class TermQueryBuilder extends BaseTermQueryBuilder<TermQueryBuilder> {public static final String NAME = "term";private static final ParseField TERM_FIELD = new ParseField("term");private static final ParseField VALUE_FIELD = new ParseField("value");/** @see BaseTermQueryBuilder#BaseTermQueryBuilder(String, String) */public TermQueryBuilder(String fieldName, String value) {super(fieldName, (Object) value);}/** @see BaseTermQueryBuilder#BaseTermQueryBuilder(String, int) */public TermQueryBuilder(String fieldName, int value) {super(fieldName, (Object) value);}/** @see BaseTermQueryBuilder#BaseTermQueryBuilder(String, long) */public TermQueryBuilder(String fieldName, long value) {super(fieldName, (Object) value);}/** @see BaseTermQueryBuilder#BaseTermQueryBuilder(String, float) */public TermQueryBuilder(String fieldName, float value) {super(fieldName, (Object) value);}/** @see BaseTermQueryBuilder#BaseTermQueryBuilder(String, double) */public TermQueryBuilder(String fieldName, double value) {super(fieldName, (Object) value);}/** @see BaseTermQueryBuilder#BaseTermQueryBuilder(String, boolean) */public TermQueryBuilder(String fieldName, boolean value) {super(fieldName, (Object) value);}/** @see BaseTermQueryBuilder#BaseTermQueryBuilder(String, Object) */public TermQueryBuilder(String fieldName, Object value) {super(fieldName, value);}
}