更新时间:2022-12-08 11:29:13 来源:极悦 浏览1674次
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天面授
Java就业班有基础 直达就业
业余时间 高薪转行
Java在职加薪班工作1~3年,加薪神器
工作3~5年,晋升架构
提交申请后,顾问老师会电话与您沟通安排学习