elastisearch开发时的发现

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": "精准查询"
    }
  }
}

你可能感兴趣的:(elasticsearch)