更新時間:2022-12-08 11:29:13 來源:動力節點 瀏覽2224次
ElasticSearch 模糊查詢可用于用戶使用錯誤輸入的關鍵字或拼寫錯誤進行搜索的場景。或者,它也可以用于基于Levenshtein Edit Distance搜索相似詞,Levenshtein Edit Distance可以定義為將一個詞更改為另一個詞所需的最小單字符編輯(插入、刪除或替換)次數。
在這篇文章中,演示了使用ElasticSearch Java API的模糊搜索。包括以下幾點:
使用 ElasticSearch 和 Kibana 進行設置
ElasticSearch 庫 POM 條目
使用 Fuzzy Query API 進行模糊搜索
使用 Match Query API 進行模糊搜索
使用布爾查詢 API 進行模糊搜索
首先,設置 ElasticSearch 和 Kibana。
創建 Java Maven 項目。將以下內容放入 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>
使用模糊查詢搜索索引需要注意以下幾點:
創建一個 TransportClient 的實例
使用 fuzzyQuery API 創建 QueryBuilder 實例
創建用于創建請求對象的 SearchRequestBuilder 實例
在 SearchRequestBuilder 實例上調用 Get API
遍歷搜索結果
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 構建 QueryBuilder 實例,該 API 稍后用于構建 SearchRequestBuilder 實例。其余代碼與上面的代碼相同。
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 構建 QueryBuilder 實例,稍后用于構建 SearchRequestBuilder 實例。其余代碼與上面的代碼相同。
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();
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習