1. term,match,query_string
- term:用作keyword类型字段精准查询,对text类型字段他也能模糊查询到
- match:用作text类型字段模糊查询
- query_string:lucence底层的模糊查询方法
下面是go-elasticsearch/v8的用法,需要看dsl的自行转换
// searchClassId long类型,term精准查询
func (s *Student_score_idx) searchClassId(cond *entity.SearchCond) *types.Query {
if cond.ClassId == 0 {
return nil
}
query := types.Query{
Term: map[string]types.TermQuery{
"class_info.class_id": {
Value: cond.ClassId,
},
},
}
return &query
}
// searchClassName text类型,match可分词模糊查询
func (s *Student_score_idx) searchClassName(cond *entity.SearchCond) *types.Query {
if cond.ClassName == "" {
return nil
}
query := types.Query{
Match: map[string]types.MatchQuery{
"class_info.class_name": {
Query: cond.ClassName,
},
},
}
return &query
}
// searchUsername wildcard类型(是keywords的一种),可分词模糊查询,这里用了query_string查询方法,是match查询的高级使用
func (s *Student_score_idx) searchUsername(cond *entity.SearchCond) *types.Query {
if cond.Username == "" {
return nil
}
query := types.Query{
QueryString: &types.QueryStringQuery{
Query: fmt.Sprintf("*%s*", cond.Username),
},
}
return &query
}
字段的子类型
业务某些字段,既精准查询也需要模糊查询就需要到子类型。
下面是某个index的mapping,subject_info.subject_name是一个text类型字段,并且给他定义了一个子字段sub_name并将它设置成keyword类型(一般子字段名都用类型string为名,此例子应该协程keyword,我这样写是为了好区分关键字)。
"subject_info": {
"type": "object",
"properties": {
"subject_name": {
"type": "text",
"fields": {
"sub_name": {
"type": "keyword"
}
}
}
}
}
使用方法就是
GET INDEXNAME/_search
{
"query": {
"term": {
"subject_info.subject_name.sub_name": "精准查询"
}
}
}

被折叠的 条评论
为什么被折叠?



