elasticsearch 관련 검색

14876 단어
상위 - 하위 관계 문서
부모-자식 관계 문서는 실질적으로 nested 모델과 유사합니다. 하나의 대상 실체와 다른 대상 실체를 연결할 수 있습니다.이 두 가지 유형의 주요 차이점은nested objects 문서에서 모든 대상은 같은 문서에 있고 부모-자식 관계 문서에서 부모 대상과 자식 대상은 완전히 독립된 문서이다.
부-자 관계의 주요 역할은 하나의 type 문서와 다른 type 문서를 연결시켜 일대다의 관계를 구성하는 것이다. 하나의 부 문서는 여러 개의 하위 문서에 대응할 수 있다.nested objects에 비해 부모-자식 관계의 주요 장점은 다음과 같습니다.
상위 문서를 업데이트할 때 하위 문서는 다시 인덱스되지 않습니다.하위 문서를 만들거나 수정하거나 삭제할 때 상위 문서나 다른 하위 문서에는 영향을 주지 않습니다.이 점은 이런 장면에서 특히 유용하다. 하위 문서의 수가 비교적 많고, 하위 문서가 만들어지고 수정되는 빈도가 높을 때.하위 문서는 검색 결과로 독립적으로 반환될 수 있습니다.Elasticsearch는 부모 문서와 하위 문서의 映射 관계를 유지합니다. 이 映射 덕분에 부모 문서와 하위 문서의 관련 조회 작업이 매우 빠릅니다.그러나 이 맵은 부모-자식 문서 관계에도 제한 조건이 있다. 부모 문서와 모든 자식 문서는 같은 섹션에 저장해야 한다.
저는 es5를 사용합니다.6,es6.0 버전 이상의 인덱스가 type1에 대응합니다.es에서 부자급 관계 조회
모/자 관계 만들기
PUT user_test
{
  "mappings": {
    "dept": {
      "properties": {
        "dname":{
          "type": "text"
        }
      }
    },
    "user":{
      "_parent": {
        "type": "dept"
      }, 
      "properties": {
        "deptId":{
          "type": "text"
        },
        "username":{
          "type": "text"
        },
        "age":{
          "type": "integer"
        }
      }
    }
  }
}

 
부서와 사용자 두 가지 유형을 포함하는 회사의 색인을 만들었습니다.
상위 데이터 추가
POST company/dept/2
{
  "dname":" "
}

새로운 하위 레벨 데이터
POST company/user?parent=2
{
  "uid":"1",
  "uname":" ",
  "age":10  
  
}

하위 등급으로 조사하다
GET company/user/_search
{
  "query": {
    "has_parent": {
      "parent_type": "dept",
      "query": {
        "term": {
          "dname":" "
        }
      },"inner_hits":{}
    }
  }
}

부급으로 조사하다
GET company/dept/_search
{
  "query": {
    "has_child": {
      "type": "user",
      "query": {
        "match": {
          "uname":" "
        }
      },"inner_hits":{}
    }
  }
}
 inner_hits —— , inner_hits type 。inner_hits 3 , from  size。
 , bool 
GET company/dept/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "dname": {
              "value": " "
            }
          }
        },{
          "has_child": {
            "type": "user",
            "query": {
              "match": {
                "uname":" "
              }
            },"inner_hits":{}
          }
        }
        
      ]
    }
  }
}

 
2. 자바 프로젝트 중 조회
실체류
1. 부서
@Document(indexName = "user_test",type = "dept")
public class Department {
    @Id
    private String id;
    private String dname;
}

2. 사용자
@Document(indexName = "user_test",type = "user")
public class User {
    @Id
    private String id;
    @Parent(type = "dept")
    private String deptId;
    private String uname;
    private Integer age;
}

 
 
ElasticsearchTemplate 사용
1 상위 데이터 조회
QueryBuilder qb=JoinQueryBuilders.hasChildQuery("user",QueryBuilders.matchAllQuery(),ScoreMode.None);
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withIndices("user_test")
                .withQuery(qb)
                .build();
        List depts= elasticsearchTemplate.queryForList(searchQuery,Department.class);
ScoreMode: minmaxsumavg none

2.

QueryBuilder qb=JoinQueryBuilders.hasParentQuery("dept",QueryBuilders.matchQuery("dname"," "),false);
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withIndices("user_test")
                .withQuery(qb)
                .build();
        List users= elasticsearchTemplate.queryForList(searchQuery,User.class);

  : has_parent도 득점으로 지원했다.기본값은 false 상위 문서의 점수를 무시합니다.
공식 참조:https://www.elastic.co/guide/en/elasticsearch/reference/5.6/query-dsl-has-parent-query.html
부자급 모든 데이터 조회

 QueryBuilder qb = JoinQueryBuilders.hasChildQuery(
                "user",                         // 
                QueryBuilders.matchQuery("uname.keyword"," "),
                ScoreMode.None
        ).innerHit(new InnerHitBuilder());
        SearchQuery searchQuery = new NativeSearchQueryBuilder()
                .withIndices("user_test")
                .withQuery(qb)
                .build();
        List depts= elasticsearchTemplate.query(searchQuery, searchResponse -> {
            SearchHits hits = searchResponse.getHits();
            List list = new ArrayList<>();
            Arrays.stream(hits.getHits()).forEach(h -> {
                Map source = h.getSource();
                SearchHits innerHitsMap=h.getInnerHits().get("user");// 
                List user1s=Arrays.stream(innerHitsMap.getHits()).map(innerH -> {
                    Map innerSource = innerH.getSource();
                    return new User(innerSource.get("uname").toString(),Integer.valueOf(innerSource.get("age").toString()));
                }).collect(Collectors.toList());
                list.add(new DeptVO(source.get("dname").toString(),user1s));
            });
            return list;
        });
JoinQueryBuilders.hasChildQuery().innerHit(new InnerHitBuilder()) .innerHit(new InnerHitBuilder()) es 

:https://www.cnblogs.com/double-yuan/p/9798103.html

좋은 웹페이지 즐겨찾기