java - 为什么 filterQuery 在 Elastic Search 的 JAVA 高级 REST 客户端中不起作用?

标签 java elasticsearch elasticsearch-high-level-restclient

我正在尝试创建一个在 Elasticsearch 索引上运行模糊搜索的函数。 仅当我指定的术语与索引中的拼写完全一致时,我才会获得匹配项。如果我故意拼错该术语中的一个字母,例如

"Boc"

,我想模糊搜索应该仍然返回相同的匹配项,但它不返回任何内容。同样,如果我用 prefixQuery 或 termQuery 替换 fuzzyMatch,则搜索仅在给出准确拼写的情况下返回结果

"Bob"

这是为什么呢?我该如何解决?哪里有解释这些方法的文档?

这是我的代码...

public void searchResults(@PathParam("index_name") String index_name) throws IOException {
    RestHighLevelClient client = createHighLevelRestClient();
    int numberOfSearchHitsToReturn = 100; // defaults to 10
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    sourceBuilder.query(QueryBuilders.fuzzyQuery("firstname", "Bob"));
    sourceBuilder.from(0);
    sourceBuilder.size(numberOfSearchHitsToReturn);
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    SearchRequest searchRequest = new SearchRequest(index_name).source(sourceBuilder);
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.print(searchResponse);
    client.close();
}

这是在 Postman 中 Get/index/_search 的结果...

{
    "took": 0,
    "timed_out": false,
    "_shards": {
        "total": 1,
        "successful": 1,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": {
            "value": 3,
            "relation": "eq"
        },
        "max_score": 1.0,
        "hits": [
            {
                "_index": "contacts",
                "_type": "_doc",
                "_id": "J1NDonABNQ4iHt4UOM4u",
                "_score": 1.0,
                "_source": {}
            },
            {
                "_index": "contacts",
                "_type": "_doc",
                "_id": "153",
                "_score": 1.0,
                "_source": {
                    "firstname": "Bob",
                    "home_city": "San Diego",
                    "home_address": "1029 Loring Street",
                    "home_zip": "92109",
                    "contact_id": "153",
                    "email": "bsmith@gmail.com",
                    "lastname": "Smith",
                    "home_state": "California",
                    "cell_phone": "6192542981"
                }
            },
            {
                "_index": "contacts",
                "_type": "_doc",
                "_id": "154",
                "_score": 1.0,
                "_source": {
                    "firstname": "Alice",
                    "home_city": "Paia",
                    "home_address": "581 Pili Loko Street",
                    "home_zip": "00012",
                    "contact_id": "154",
                    "email": "aHernes@gmail.com",
                    "lastname": "Hernes",
                    "home_state": "Hawaii",
                    "cell_phone": "8083829103"
                }
            }
        ]
    }
}

最佳答案

我相信弹性会让你有点困惑。

3 个字母项的模糊函数为 1,因此您期望返回“Bob”是很公平的。但是,我假设您使用默认使用过滤器的标准分析器 “小写”。

因此计算出的“Boc”和“bob”之间的编辑距离是2,这就是不返回它的原因。

尝试小写输入项,我打赌将返回“Bob”。

// no results
{
    "query": {
       "fuzzy" : { "firstname" : "Boc" }
    }
}
// "Bob" returned
{
    "query": {
       "fuzzy" : { "firstname" : "boc" }
    }
}

这有意义吗?

关于您的代码:

public void searchResults(@PathParam("index_name") String index_name) throws IOException {
    RestHighLevelClient client = createHighLevelRestClient();
    int numberOfSearchHitsToReturn = 100; // defaults to 10
    SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
    // "Boc".toLowerCase() or simply "boc"
    sourceBuilder.query(QueryBuilders.fuzzyQuery("firstname", "Boc".toLowerCase()));
    sourceBuilder.from(0);
    sourceBuilder.size(numberOfSearchHitsToReturn);
    sourceBuilder.timeout(new TimeValue(60, TimeUnit.SECONDS));
    SearchRequest searchRequest = new SearchRequest(index_name).source(sourceBuilder);
    SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
    System.out.print(searchResponse);
    client.close();
}

关于java - 为什么 filterQuery 在 Elastic Search 的 JAVA 高级 REST 客户端中不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60519252/

相关文章:

java - 在Java中,如何在几行而不是一行中初始化数组中的元素?

java - 如何用Java实现多线程PID Controller ?

java - 如何将输入流文件分配给json?

elasticsearch - 设置 Elastic Search 单节点集群时出现问题

elasticsearch - ElasticSearch中可返回但不可查询的字段

elasticsearch - JAVA的createIndex elasticsearch高级REST客户端错误地进行了设置

java - 将字符串与字母和数字转换

Elasticsearch 5.0.2 ignore_above 给出不受支持的参数错误

elasticsearch - 查询构建器在Elastic Search JAVA高级重置客户端中找不到匹配项

java - 在反向代理后面访问 ElastiC