java API的字符串查询不会按名称查找某些文档

时间:2016-07-10 05:36:07

标签: java elasticsearch elasticsearch-plugin

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

我正在使用elasticsearch java api为托管我的文档的应用程序工作。 一切正常,我能够在数据库中搜索并保存在我的索引上,我可以按字段和很多很酷的东西来计算我的文档,但我还是坚持了一个奇怪的问题。

当我尝试按名称字段搜索我的文档时,某些文档在搜索时不会返回。

让我举个例子:

我的文档看起来像这样(例如):

id:1 名字:书 类型:pdf

id: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"
                }
                    }
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

好吧,经过几个小时的搜索,我解决了我的问题。

为了解决这个问题,我使用了来自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 后,只需将其添加到 MultipleSearchResponse SearchResponse

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

就我而言,我有3个不同的查询,所以我使用了MultipleSearchResponse。