elasticsearchnested 삽입 대상 전체 텍스트 검색 및 정렬

4825 단어 검색 엔진

 


ES Nested 중첩 유형은 무엇입니까?Elasticsearch에는 다음과 같은 다양한 데이터 유형이 있습니다.
  • 기본 데이터 형식:string 형식.ES 7.x에서string 형식은:text와 키워드로 업그레이드됩니다.keyword 정렬 가능;텍스트 기본 분사, 정렬할 수 없습니다..
  • 데이터 형식:integer,long 등
  • 시간 유형, 볼 유형, 바이너리 유형, 구간 유형 등
  • 복잡한 데이터 유형:
  • 그룹 유형: Array
  • 객체 유형: Object Nested 유형
  • 특정 데이터 유형: 지리적 위치, IP 등 주의: tring/nested/array 형식 필드는 정렬 필드로 사용할 수 없습니다.따라서string 형식은:text와keyword로 업그레이드됩니다.키워드는 정렬할 수 있습니다.text 기본 단어는 정렬할 수 없습니다..

  • nested 형식은 특수한 [object,object] 형식입니다.이 유형은 object 그룹 내의 요소에 대한 단독 조회를 허용합니다. 차이점은 다음과 같습니다.
  • object: Lucene는 내부object의 개념이 없기 때문에 Elasticsearch 내부에서object를 간단한 필드 이름과 값의 정보로 해석합니다. 바로 모든 필드가 평평하게 깔려 있습니다. 
  • nested: Elasticsearch 내부에서 그룹의 모든 요소를 숨겨진 문서로 간주하기 때문에 [query-dsl-nested-query,nestedquery]를 사용할 수 있습니다

  • 네스트된 모델의 장단점은 다음과 같습니다.
  • 문서가 함께 저장되어 읽기 성능이 높다
  • 중첩된 문서를 수정하거나 삭제하려면 전체 문서를 다시 인덱스해야 합니다.따라서 중첩된 문서가 많을수록 비용이 많이 듭니다..

  • 동적 매핑 필드 데이터 유형은 미리 정의할 필요가 없으며 ES 내부에 기본 필드 유형이 자동으로 매핑됩니다.object 형식이라면 데이터가 동기화될 때 내부의text를text로 비추고 키owd의 하위 형식을 가져옵니다.참고

    네스트 유형 검색


    object 형식의 filed는 텍스트 형식 필드에 키워드를 추가하지 않고 단어를 구분하지 않습니다.그래서 네트 스타일로 바꿨어요.삽입 대상 (nestedobjects) 은 분리된 숨겨진 문서로 인덱스되기 때문에, 직접 조회할 수 없습니다.nested 쿼리나 nested 필터를 사용하여 접근합니다.
    GET /my_index/blogpost/_search
    {
      "query": {
        "bool": {
          "must": [
            { "match": { "title": "eggs" }}, <1>
            {
              "nested": {
                "path": "comments", <2>
                "query": {
                  "bool": {
                    "must": [ <3>
                      { "match": { "comments.name": "john" }},
                      { "match": { "comments.age":  28     }}
                    ]
            }}}}
          ]
    }}}

    중첩 필드 정렬 문제

    
    PUT /my_index/blogpost/2
    {
      "title": "Investment secrets",
      "body":  "What they don't tell you ...",
      "tags":  [ "shares", "equities" ],
      "comments": [
        {
          "name":    "Mary Brown",
          "comment": "Lies, lies, lies",
          "age":     42,
          "stars":   1,
          "date":    "2014-10-18"
        },
        {
          "name":    "John Smith",
          "comment": "You're making it up!",
          "age":     28,
          "stars":   2,
          "date":    "2014-10-16"
        }
      ]
    }
    

    중첩된 질의
    GET /_search
    {
      "query": {
        "nested": { 
          "path": "comments",
          "filter": {
            "range": {
              "comments.date": {
                "gte": "2014-10-01",
                "lt":  "2014-11-01"
              }
            }
          }
        }
      },
      "sort": {
        "comments.stars": { 
          "order": "asc",   
          "mode":  "min",   
          "nested_filter": { 
            "range": {
              "comments.date": {
                "gte": "2014-10-01",
                "lt":  "2014-11-01"
              }
            }
          }
        }
      }
    }

    위의 방안은 ES6.1 이후에는 안 됩니다. 플러그인 형식의 정렬은 특수한 정렬nestedsort 옵션이 있기 때문에 시작하는 방식은netsed 조회와 비슷합니다.그래서 저희가 업그레이드를 해봤어요.
    POST /_search
    {
       "query" : {
          "term" : { "product" : "chocolate" }
       },
       "sort" : [
           {
              "offer.price" : {
                 "mode" :  "avg",
                 "order" : "asc",
                 "nested": {
                    "path": "offer",
                    "filter": {
                       "term" : { "offer.color" : "blue" }
                    }
                 }
              }
           }
        ]
    }
    

    java 코드 작성
      BoolQueryBuilder boolBuilder = QueryBuilders.boolQuery();
                RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("custom_info.deptUpdateTime");
                rangeQueryBuilder.gte(condition.getDeptUpdateTime().getStartTime() + "T00:00:00");
                rangeQueryBuilder.lte(condition.getDeptUpdateTime().getEndTime() + "T23:59:59");
                boolBuilder.must(rangeQueryBuilder);
                QueryBuilder nestedQueryBuilder = new NestedQueryBuilder(
                    "custom_info",
                    boolBuilder,
                    ScoreMode.None
                );
                

    참조 문서


    netst——path
    ElasticSearch의 Nested 데이터 유형

    좋은 웹페이지 즐겨찾기