2014-04-19 32 views
1

我正在使用ElasticSearch Java API進行搜索。我有四個領域:Elasticsearch在搜索時排除一個字段

  1. 關鍵
  2. DOB
  3. 地址

在尋找我使用下面的查詢:

QueryBuilder的QB = QueryBuilders.queryString(」 Pritish「);

這是搜索時包含的關鍵。另外,我不想選擇的Fileds爲:

點域(「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 
    } 
    } 
} 
} 

現在,當我執行搜索查詢時,它仍然顯示我哪些搜索對鍵的結果。

我不確定發生了什麼問題。任何人都可以幫忙解決這個問題嗎?

+1

你想控制你正在搜索的字段或返回的字段嗎? – javanna

+0

只是出於好奇,爲什麼你不想返回第四場。它是性能嗎?另一個原因? –

+0

我想在搜索時控制字段。在返回時,我不控制任何字段。現在,我的密鑰是隨機的UUID。如果我搜索abc或123,它正在搜索地址和密鑰,並給我不必要的結果。 –

回答

3

徹底讀完映射文檔後,我終於在創建映射時發現了我的錯誤。我爲密鑰生成映射如下(以課題提交代碼):

字段(「索引」,「not_analyzed」)

讀取原稿後,我改變上述行如下:

場( 「指數」, 「無」)

我真的很感謝CodeSculptor了他的想法。現在,它按照我的要求工作。

非常感謝。

1

從我的理解你不想在這一個特定領域搜索。在這種情況下,部分字段(由Elastic Search 1.0.0beta1通過源代碼過濾替代)對您沒有用處,因爲它們是除查詢以外的單獨事物,僅用於從結果文檔中獲取部分信息。它不會影響搜索是否在某個領域進行。

您只能選擇特定的字段進行搜索使用一些類延伸QueryBuilder接口和什麼是壞消息,只有選擇字段的可能性是通過添加它們。

另一方面,如果不是在某個特定情況下不想搜索此特定字段的情況,而只是一個將包含相關信息作爲結果的字段,並且永遠不會搜索,你可以指定這個領域沒有索引。您可以將字段的index屬性設置爲no,而mapping。這應該導致有字段將被存儲並以整個JSON作爲文檔的源返回,但不能被搜索。

+0

嘿, 閱讀映射文檔後,我認爲這肯定會對我的場景有幫助。我正在使用Java API創建索引。你有什麼想法如何設置映射?我的代碼如下所示: BulkRequestBuilder bulk = client.prepareBulk(); \t \t \t \t \t \t \t bulk.add(client.prepareIndex(this.indexName, \t \t \t \t \t \t \t \t this.indexName,密鑰).setSource( \t \t \t \t \t \t \t \t jsonBuilder() \t \t \t \t \t \t \t \t \t \t .startObject() \t \t \t \t \t \t \t \t \t \t點域( 「鑰匙」,密鑰) \t \t \t \t \t \t \t \t \t .endObject())); 在這裏,我想添加對密鑰的映射。 –