Elasticsearch在搜索时排除一个字段

时间:2014-04-19 02:26:36

标签: elasticsearch

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

  1. 名称
  2. DOB
  3. 地址
  4. 搜索时我正在使用以下查询:

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

    搜索时包含密钥。另外,我不想选择文件:

    .fields(“DOB”,“name”,“address”)

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

答案 0 :(得分:3)

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

字段("指数"" not_analyzed&#34)

阅读完文件后,我改变了上面一行:

字段("指数""无&#34)

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

非常感谢你。

答案 1 :(得分:1)

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

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

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