【问题标题】:Elasticsearch exclude one field while searchElasticsearch 在搜索时排除一个字段
【发布时间】:2014-04-22 04:37:13
【问题描述】:

我正在使用 ElasticSearch Java API 进行搜索。我有四个字段:

  1. 姓名
  2. 出生日期
  3. 地址

在搜索时,我使用以下查询:

QueryBuilder qb =QueryBuilders.queryString("Pritish");

这包括搜索时的键。另外,我不想选择文件为:

.fields("出生日期", "姓名", "地址")

有没有办法排除字段?我在寻找 ParitalFields。对我的情况有用吗?有人可以为此提供 java 示例吗?

现在,我添加了如下映射:

/****************************** 创建索引 ***** *************************/

XContentBuilder mapping = jsonBuilder()

    .startObject()
        .startObject(indexName)
            .startObject("properties")
                .startObject("key")
                    .field("type", "string") 
                    .field("index","not_analyzed")
                    .field("store", "false")
                .endObject()
                .startObject("addr1")
                    .field("type","string")
                .endObject()
                .startObject("DOB")
                    .field("type","string")
                .endObject()
                .startObject("name")
                    .field("type","string")
                .endObject()
            .endObject()
        .endObject()
    .endObject();

client.admin()
        .indices()
        .preparePutMapping(indexName)
        .setType(indexName)
        .setSource(mapping)
        .execute()
        .actionGet();

/********************** 插入数据 ************ *****************/

    XContentBuilder x = jsonBuilder()

        .startObject()
            .field("key", key)
            .field("addr1", "abc road")
            .field("DOB", "09092009")
            .field("name","test")

    .endObject();
bulk.add(client.prepareIndex(indexName, indexName).setSource(x));

/****************** 搜索查询********************* */

QueryBuilder qb =QueryBuilders.queryString("*e434*");

SearchResponse response = client.prepareSearch(indexName)

    .setQuery(qb)
    .setFrom(0)
    .setSize(100)
    .execute()
    .actionGet();

SearchHit[] results = response.getHits().hits();

当我看到索引元数据时,它显示了正确的映射如下:

mappings: {
   indexName: {
     properties: {
     addr1: {
         type: string
     }
     name: {
         type: string
     }
     key: {
         index: not_analyzed
         type: string
     }
     acct_type: {
         type: string
     }
  }
}
}

现在,当我执行搜索查询时,它仍然向我显示针对键搜索的结果。

我不确定出了什么问题。有人可以帮忙解决这个问题吗?

【问题讨论】:

  • 您想控制您正在搜索的字段或返回的字段吗?
  • 只是出于好奇,你为什么不想返回第四个字段。是性能吗?另一个原因?
  • 我想在搜索时控制字段。返回时我不控制任何字段。现在,我的密钥是随机 UUID。如果我搜索 abc 或 123,它正在搜索地址和密钥,并给我不必要的结果。

标签: elasticsearch


【解决方案1】:

在仔细阅读了映射文档之后,我终于在创建映射时发现了我的错误。我正在为键创建映射如下(参考问题中的代码):

field("index","not_analyzed")

阅读文档后,我将上面的行更改为:

field("index","no")

我非常感谢 CodeSculptor 的想法。现在,它正在按照我的要求工作。

非常感谢。

【讨论】:

    【解决方案2】:

    据我了解,您不想在这一特定领域进行搜索。在这种情况下,部分字段(在 Elastic Search 1.0.0beta1 中由源过滤替换)对您没有用处,因为它们与查询分开,仅用于从结果文档中获取部分信息。不影响是否对某个字段进行搜索。

    您只能使用扩展QueryBuilder接口的某些类来选择特定字段进行搜索,这对您来说是个坏消息,选择字段的唯一可能性是添加它们。

    另一方面,如果不是在某个特定情况下您不想在此特定字段上进行搜索,而它只是一个将包含相关信息作为结果且永远不会被搜索的字段开,您可以将此字段指定为未编入索引。您可以将字段的index 属性设置为nomapping。这应该会导致字段将与整个 JSON 作为文档的源一起存储和返回,但不可搜索。

    【讨论】:

    • 嘿,看完映射文档后,我认为这对我的场景肯定会有所帮助。我正在使用 Java API 创建索引。你知道如何设置映射吗?我的代码如下所示: BulkRequestBuilder bulk = client.prepareBulk(); bulk.add(client.prepareIndex(this.indexName, this.indexName, key).setSource(jsonBuilder() .startObject() .field("key", key) .endObject()));在这里,我想添加对键的映射。
    猜你喜欢
    • 1970-01-01
    • 2018-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 2020-09-03
    • 2019-11-16
    • 2021-03-10
    相关资源
    最近更新 更多