Home Articles

Elasticsearch在搜索时排除一个字段

Asked
Viewed 1700 times
1

我正在使用ElasticSearch Java API进行搜索 . 我有四个领域:

  • 名字

  • DOB

  • 地址

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

QueryBuilder qb = QueryBuilders.queryString(“Pritish”);

这包括搜索时的密钥 . 另外,我不想选择文件:

.fields(“DOB”,“名称”,“地址”)

有没有办法排除字段?我在寻找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
     }
  }
}
}

现在,当我执行搜索查询时,它仍然显示搜索密钥的结果 .

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

2 Answers

  • 3

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

    您只能使用某些扩展QueryBuilder接口的类来选择特定字段进行搜索,这对您来说是个坏消息,只有通过添加字段才能选择字段 .

    另一方面,如果不是仅仅包含将作为结果包含相关信息且永远不会被搜索的字段的情况,则可以将此字段指定为未编入索引 . 您可以将字段的 index 属性设置为 no ,而mapping . 这应该导致具有将以整个JSON作为文档源存储和返回的字段,但不能被搜索 .

  • 1

    在彻底阅读了映射文档之后,我终于在创建映射时发现了我的错误 . 我正在为密钥创建映射,如下所示(请参阅问题中的代码):

    field("index","not_analyzed")

    阅读完文件后,我改变了以上内容,如下所示:

    field("index","no")

    我真的很感谢CodeSculptor的想法 . 现在,它按照我的要求工作 .

    非常感谢 .

Related