2014-04-19 2 views
1

검색 용 ElasticSearch Java API를 사용하고 있습니다. 나는 네 개의 필드가 있습니다검색 할 때 Elasticsearch에서 한 필드 제외

  1. 이름
  2. DOB를
  3. 주소

나는 다음과 같은 쿼리를 사용하고 검색하는 동안 "(

QueryBuilder QB = QueryBuilders.queryString을 피츠버그 ");

검색 중에는 키가 포함됩니다.

.fields ("DOB", "이름", "주소")

필드를 제외 할 수있는 방법이 있나요 : 또한, 나는 같은 fileds을 선택하고 싶지 않아? 나는 ParitalFields를 찾고 있었다. 내 사건에 유용 할까? 어떤 사람이 이것을 위해 자바 예제를 제공 할 수 있습니까?

/***************************** 만들기 다음과 같이

지금, 나는 매핑을 추가 한 인덱스 ******************************/

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 \t \t .startObject \t \t \t \t .field() \t \t \t \t (키 "키") \t \t \t \t \t \t \t \t \t .endObject())); 여기 키와 매핑을 추가하고 싶습니다. –

관련 문제