更新時(shí)間:2022-12-08 11:29:13 來源:動(dòng)力節(jié)點(diǎn) 瀏覽2371次
ElasticSearch 模糊查詢可用于用戶使用錯(cuò)誤輸入的關(guān)鍵字或拼寫錯(cuò)誤進(jìn)行搜索的場景。或者,它也可以用于基于Levenshtein Edit Distance搜索相似詞,Levenshtein Edit Distance可以定義為將一個(gè)詞更改為另一個(gè)詞所需的最小單字符編輯(插入、刪除或替換)次數(shù)。
在這篇文章中,演示了使用ElasticSearch Java API的模糊搜索。包括以下幾點(diǎn):
使用 ElasticSearch 和 Kibana 進(jìn)行設(shè)置
ElasticSearch 庫 POM 條目
使用 Fuzzy Query API 進(jìn)行模糊搜索
使用 Match Query API 進(jìn)行模糊搜索
使用布爾查詢 API 進(jìn)行模糊搜索
首先,設(shè)置 ElasticSearch 和 Kibana。
創(chuàng)建 Java Maven 項(xiàng)目。將以下內(nèi)容放入 pom.xml 文件中以使用 ElasticSearch Java API:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.2.2</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20180130</version>
</dependency>
使用模糊查詢搜索索引需要注意以下幾點(diǎn):
創(chuàng)建一個(gè) TransportClient 的實(shí)例
使用 fuzzyQuery API 創(chuàng)建 QueryBuilder 實(shí)例
創(chuàng)建用于創(chuàng)建請求對(duì)象的 SearchRequestBuilder 實(shí)例
在 SearchRequestBuilder 實(shí)例上調(diào)用 Get API
遍歷搜索結(jié)果
public class App {
private static final String INDEX_NAME = "recruitment";
private static final String INDEX_TYPE = "interviews";
public static void main(String[] args) throws IOException {
//
// Create an instance of TransportClient
//
TransportClient client = = new PreBuiltTransportClient(Settings.EMPTY)
.addTransportAddress(new TransportAddress(InetAddress.getByName("127.0.0.1"), 9300));
//
// Create a query builder using fuzzyQuery Method
// Name of the key to search: name
// Value to search: "vitalflux"
//
QueryBuilder queryBuilder = QueryBuilders.fuzzyQuery(name, "vitalflux").boost(1.0f).prefixLength(0).fuzziness(Fuzziness.ONE).transpositions(true);
//
// Create an instance of SearchRequestBuilder
//
SearchRequestBuilder requestBuilder = client.prepareSearch(INDEX_NAME).setTypes(INDEX_TYPE)
.setQuery(queryBuilder).setSize(100);
//
// Get the search result
//
SearchResponse response = requestBuilder.get();
//
// Iterate through search results
//
SearchHit[] srchHits = response.getHits().getHits();
String[] result = new String[srchHits.length];
int i = 0;
for (SearchHit srchHit : srchHits) {
result[i++] = (String) srchHit.getSourceAsMap().get(KEY_NAME);
}
}
}
以下代碼可用于使用 Match Query API 構(gòu)建 QueryBuilder 實(shí)例,該 API 稍后用于構(gòu)建 SearchRequestBuilder 實(shí)例。其余代碼與上面的代碼相同。
QueryBuilder queryBuilder = QueryBuilders.matchQuery("name", "vitalflux").fuzziness(Fuzziness.ONE).boost(1.0f).prefixLength(0).fuzzyTranspositions(true);
//
// Create an instance of SearchRequestBuilder
//
SearchRequestBuilder requestBuilder = client.prepareSearch(INDEX_NAME).setTypes(INDEX_TYPE).setQuery(queryBuilder).setSize(100);
//
// Get the search result
//
SearchResponse response = requestBuilder.get();
以下代碼可用于使用 Bool Query API 構(gòu)建 QueryBuilder 實(shí)例,稍后用于構(gòu)建 SearchRequestBuilder 實(shí)例。其余代碼與上面的代碼相同。
QueryBuilder queryBuilder = QueryBuilders.matchQuery(KEY_NAME, refNumber).fuzziness(editDistance).boost(1.0f).prefixLength(0).fuzzyTranspositions(true);
//
// Create Bool Query Builder
//
final QueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(fuzzyQueryBuilder);
//
// Create an instance of SearchRequestBuilder
//
SearchRequestBuilder requestBuilder = client.prepareSearch(INDEX_NAME).setTypes(INDEX_TYPE).setQuery(boolQueryBuilder).setSize(100);
//
// Get the search result
//
SearchResponse response = requestBuilder.get();
相關(guān)閱讀