elasticsearch 관련 검색
부모-자식 관계 문서는 실질적으로 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: min
,max
,sum
,avg
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.