专注Java教育14年 全国咨询/投诉热线:400-8080-105
动力节点LOGO图
始于2009,口口相传的Java黄埔军校
首页 学习攻略 Java学习 Java中ElasticSearch模糊查询的示例

Java中ElasticSearch模糊查询的示例

更新时间:2022-12-08 11:29:13 来源:动力节点 浏览1491次

ElasticSearch 模糊查询可用于用户使用错误输入的关键字或拼写错误进行搜索的场景。或者,它也可以用于基于Levenshtein Edit Distance搜索相似词,Levenshtein Edit Distance可以定义为将一个词更改为另一个词所需的最小单字符编辑(插入、删除或替换)次数。

在这篇文章中,演示了使用ElasticSearch Java API的模糊搜索。包括以下几点:

使用 ElasticSearch 和 Kibana 进行设置

ElasticSearch 库 POM 条目

使用 Fuzzy Query API 进行模糊搜索

使用 Match Query API 进行模糊搜索

使用布尔查询 API 进行模糊搜索

使用 ElasticSearch 和 Kibana 进行设置

首先,设置 ElasticSearch 和 Kibana。

ElasticSearch 库 POM 条目

创建 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>

使用模糊查询 API 进行模糊搜索

使用模糊查询搜索索引需要注意以下几点:

创建一个 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);
        }
    }
}

使用匹配查询 API 进行模糊搜索

以下代码可用于使用 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();

使用布尔查询 API 进行模糊搜索

以下代码可用于使用 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();

 

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>