java API 的字符串查询没有按名称找到某些文档

String Query for java API dosen’t find some documents by name

首先,抱歉我的英语不好,但让我试着解释一下我的问题。

我正在使用 elasticsearch java api 来管理我的文档。 一切正常,我可以在数据库中搜索并保存在我的索引中,我可以按字段和很多很酷的东西来计算我的文档聚合,但我遇到了一个奇怪的问题。

当我尝试按名为名称的字段搜索我的文档时,有些文档 return 无法搜索。

举个例子:

我的文档是这样的(仅举个例子):

编号:1 名称:书 类型:pdf

编号:2 名称:我的搜索服务测试 类型:zip

当我尝试搜索时,如果我按名称搜索,将值 "book" 作为参数发送,它工作正常,但是当我尝试搜索时,发送我的参数值 "service",结果为空。

这是我的搜索代码:

SearchRequestBuilder src1 = client.prepareSearch().setQuery(QueryBuilders.queryStringQuery(parameter).field("name"));

谁知道,为什么此搜索在 ID 为 2 的文档的名称字段中找不到我的参数值 "service"?

谢谢!

附加信息:

我的总索引信息:

 {
    "template": "*",
    "settings": {
        "index.refresh_interval": "5s"
    },
    "mappings": {
        "_default_": {
            "_all": {
                "enabled": true
            },
            "dynamic_templates": [
                {
                    "string_fields": {
                        "match": "*",
                        "match_mapping_type": "string",
                        "mapping": {
                            "index": "not_analyzed",
                            "omit_norms": true,
                            "type": "string"
                        }
                    }
                }
            ],
            "properties": {
                "@version": {
                    "type": "string",
                    "index": "not_analyzed"
                }
                    }
                }
            }
        }
    }
}

好吧,找了好几个小时,我解决了我的问题。

为了解决这个问题,我使用了来自 elasticsearch java api 的通配符查询,现在我可以在我的字段中搜索字符串参数。

代码如下:

SearchRequestBuilder srch1 = client.prepareSearch()
                .setIndices("index_name")
                .setTypes("type_name")
                .setSearchType(SearchType.DFS_QUERY_AND_FETCH)
                .setQuery(QueryBuilders.wildcardQuery("field_name", "*"+string_parameter+"*"));

构建完 SearchRequestBuilder 后,只需将其添加到 MultipleSearchResponseSearchResponse 中:

MultiSearchResponse sr = client.prepareMultiSearch()
                    .add(srch1)
                    .add(srch2)
                    .add(srch3)
                    .execute().actionGet();

在我的例子中,我有 3 个不同的查询,所以我使用了 MultipleSearchResponse。