【全文搜索引擎】Elasticsearch之模糊查询
wildcard查詢(xún)
通配符查詢(xún)?cè)试S我們?cè)诓樵?xún)值中使用*和?等通配符。此外,通配符查詢(xún)跟詞條查詢(xún)?cè)趦?nèi)容方面非常類(lèi)似。可以發(fā)送一下查詢(xún),來(lái)匹配所有包含cr?me詞條的文檔,這里?表示任意字符:
{"query" : {"wildcard" : {"title" : "cr?me"}} }這將匹配title字段中包含與cr?me匹配的詞條的所有文檔。然后,還可以在通配符查詢(xún)中包含加權(quán)屬性;它將影響每個(gè)與給定值匹配的詞條的重要性。如果要改變之前的查詢(xún),給它一個(gè)20.0的加權(quán),可以發(fā)出以下查詢(xún):
{"query" : {"wildcard" : {"title" : {"value" : "cr?me","boost" : 20.0}}} }注意,通配符查詢(xún)不太注重性能,在可能時(shí)應(yīng)盡量避免,特別是要避免前綴通配符(以通配符開(kāi)始的詞條)。此外,請(qǐng)注意Elasticsearch會(huì)重寫(xiě)通配符查詢(xún),因此Elasticsearch允許通過(guò)一個(gè)額外的參數(shù)控制重寫(xiě)方法。
代碼實(shí)現(xiàn):
GET goods/_search {"query" : {"wildcard" : {"brandName" : {"value" : "華*",}}} }java代碼
/*** 模糊查詢(xún):WildcardQuery*/ @Test public void testWildcardQuery() throws IOException {// 構(gòu)建查詢(xún)請(qǐng)求對(duì)象,指定查詢(xún)的索引名稱(chēng)SearchRequest searchRequest = new SearchRequest("goods");// 創(chuàng)建查詢(xún)條件構(gòu)建器SearchSourceBuilderSearchSourceBuilder sourceBulider = new SearchSourceBuilder();// 查詢(xún)條件WildcardQueryBuilder query = QueryBuilders.wildcardQuery("title", "華*");// 指定查詢(xún)條件sourceBulider.query(query);// 添加查詢(xún)條件構(gòu)建器 SearchSourceBuildersearchRequest.source(sourceBulider);// 查詢(xún),獲取查詢(xún)結(jié)果SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);// 獲取命中對(duì)象 SearchHitsSearchHits searchHits = searchResponse.getHits();//獲取記錄數(shù)long value = searchHits.getTotalHits().value;System.out.println("總記錄數(shù):"+value);List<Goods> goodsList = new ArrayList<>();// 獲取Hits數(shù)據(jù) 數(shù)組SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {// 獲取json字符串格式的數(shù)據(jù)String sourceAsString = hit.getSourceAsString();//轉(zhuǎn)為javaGoods goods = JSON.parseObject(sourceAsString, Goods.class);goodsList.add(goods);}for (Goods goods : goodsList) {System.out.println(goods);} }regexp查詢(xún)
通過(guò)正則表達(dá)式查詢(xún),可以使用正則表達(dá)式來(lái)查詢(xún)文本。請(qǐng)記住,此類(lèi)查詢(xún)的性能取決于所選的正則表達(dá)式。如果我們的正則表達(dá)式匹配許多詞條,查詢(xún)將很慢。一般規(guī)則是,正則表達(dá)式匹配的詞條數(shù)越高,查詢(xún)?cè)铰?br /> 正則表達(dá)式查詢(xún)示例如下所示:
{"query" : {"regexp" : {"title" : {"value" : "cr.m[ae]","boost" : 10.0}}} }上述查詢(xún)將被Elasticsearch重寫(xiě)成若干個(gè)詞條查詢(xún),根據(jù)索引中匹配給定正則表達(dá)式的內(nèi)容。查詢(xún)中加權(quán)參數(shù)指定了生成的查詢(xún)將使用的加權(quán)值。
代碼實(shí)現(xiàn):
GET goods/_search {"query" : {"regexp" : {"title" : {"value" : "\\w+(.)*",}}} }java代碼
/*** 模糊查詢(xún):regexpQuery*/ @Test public void testRegexpQuery() throws IOException {// 構(gòu)建查詢(xún)請(qǐng)求對(duì)象,指定查詢(xún)的索引名稱(chēng)SearchRequest searchRequest = new SearchRequest("goods");// 創(chuàng)建查詢(xún)條件構(gòu)建器SearchSourceBuilderSearchSourceBuilder sourceBulider = new SearchSourceBuilder();// 查詢(xún)條件RegexpQueryBuilder query = QueryBuilders.regexpQuery("title", "\\w+(.)*");// 指定查詢(xún)條件sourceBulider.query(query);// 添加查詢(xún)條件構(gòu)建器 SearchSourceBuildersearchRequest.source(sourceBulider);// 查詢(xún),獲取查詢(xún)結(jié)果SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);// 獲取命中對(duì)象 SearchHitsSearchHits searchHits = searchResponse.getHits();//獲取記錄數(shù)long value = searchHits.getTotalHits().value;System.out.println("總記錄數(shù):"+value);List<Goods> goodsList = new ArrayList<>();// 獲取Hits數(shù)據(jù) 數(shù)組SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {// 獲取json字符串格式的數(shù)據(jù)String sourceAsString = hit.getSourceAsString();// 轉(zhuǎn)為javaGoods goods = JSON.parseObject(sourceAsString, Goods.class);goodsList.add(goods);}for (Goods goods : goodsList) {System.out.println(goods);} }prefix查詢(xún)
前綴查詢(xún)?cè)谂渲梅矫鎭?lái)說(shuō)跟詞條查詢(xún)類(lèi)似。前綴查詢(xún)能讓我們匹配這樣的文檔:它們的特定字段以給定的前綴開(kāi)始。例如,想找到所有title字段以cri開(kāi)始的文檔,可以運(yùn)行以下查詢(xún):
{"query" : {"prefix" : {"title" : "cri"}} }與詞條查詢(xún)類(lèi)似,還可以在前綴查詢(xún)中包含加權(quán)屬性;這將影響到給定前綴的重要性。例如,改變之前的查詢(xún),并給它增加3.0的加權(quán),發(fā)出以下查詢(xún):
{"query" : {"prefix" : {"title" : {"value" : "cri","boost" : 3.0}}} }Elasticsearch會(huì)把前綴查詢(xún)重寫(xiě),也允許我們傳遞額外的參數(shù)來(lái)控制重寫(xiě)方法。
代碼實(shí)現(xiàn):
GET goods/_search {"query" : {"prefix" : {"title" : {"value" : "華",}}} }java代碼
/*** 模糊查詢(xún):perfixQuery*/ @Test public void testPrefixQuery() throws IOException {// 構(gòu)建查詢(xún)請(qǐng)求對(duì)象,指定查詢(xún)的索引名稱(chēng)SearchRequest searchRequest = new SearchRequest("goods");// 創(chuàng)建查詢(xún)條件構(gòu)建器SearchSourceBuilderSearchSourceBuilder sourceBulider = new SearchSourceBuilder();// 查詢(xún)條件PrefixQueryBuilder query = QueryBuilders.prefixQuery("brandName", "三");// 指定查詢(xún)條件sourceBulider.query(query);// 添加查詢(xún)條件構(gòu)建器 SearchSourceBuildersearchRequest.source(sourceBulider);// 查詢(xún),獲取查詢(xún)結(jié)果SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);// 獲取命中對(duì)象 SearchHitsSearchHits searchHits = searchResponse.getHits();//獲取記錄數(shù)long value = searchHits.getTotalHits().value;System.out.println("總記錄數(shù):"+value);List<Goods> goodsList = new ArrayList<>();// 獲取Hits數(shù)據(jù) 數(shù)組SearchHit[] hits = searchHits.getHits();for (SearchHit hit : hits) {//獲取json字符串格式的數(shù)據(jù)String sourceAsString = hit.getSourceAsString();//轉(zhuǎn)為javaGoods goods = JSON.parseObject(sourceAsString, Goods.class);goodsList.add(goods);}for (Goods goods : goodsList) {System.out.println(goods);} }總結(jié)
以上是生活随笔為你收集整理的【全文搜索引擎】Elasticsearch之模糊查询的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【全文搜索引擎】Elasticsearc
- 下一篇: 【消息中间件】浅谈中间件优缺Rabbit