/***************************************************************************** * function name : SearchFieldByString * params : query field * return : * * description : 在指定字段检索相应的query,用于正常检索 * ******************************************************************************/ func (this *IndexSet) SearchFieldByString(query string, field string) ([]utils.DocIdInfo, bool) { var terms []string switch this.FieldInfo[field].SType { case 1: //正常切词 terms = utils.RemoveDuplicatesAndEmpty(this.Segmenter.Segment(query, false)) case 2: //按单个字符进行切词 terms = utils.RemoveDuplicatesAndEmpty(strings.Split(query, "")) case 3: //按规定的分隔符进行切词 terms = utils.RemoveDuplicatesAndEmpty(strings.Split(query, ",")) } //按照最大切分进行切词 //terms := utils.RemoveDuplicatesAndEmpty(this.Segmenter.Segment(query, false)) //this.Logger.Info("TERMS :: %v ", terms) //首先按照字段检索 //交集结果 var res_list []utils.DocIdInfo _, ok := this.IvtIndex[field] if !ok { return nil, false } isFound := true for index, term := range terms { l, ok := this.IvtIndex[field].Find(term) if !ok { isFound = false break } //this.Logger.Info("[Term : %v ] [Field: %v ] DocIDs : %v", term, field, l) //求交集 if index == 0 { res_list = l } else { res_list, ok = utils.Interaction(l, res_list) if !ok { isFound = false break } } } if len(res_list) > 0 && isFound == true { return res_list, true } return nil, false }
/***************************************************************************** * function name : SearchString * params : query * return : doc链 * * description : 检索函数,根据关键字进行检索,先在同一个字段中检索,如果没有结果进行跨字段检索 * ******************************************************************************/ func (this *IndexSet) SearchString(query string) ([]utils.DocIdInfo, bool) { //按照最大切分进行切词 //terms := utils.RemoveDuplicatesAndEmpty(this.Segmenter.Segment(query,false)) //首先按照字段检索 var res_list []utils.DocIdInfo var ok bool for key, _ := range this.IvtIndex { if this.IvtIndex[key].GetType() != 1 { continue } res_list, ok = this.SearchFieldByString(query, key) if ok { return res_list, true } } //如果数量不够,跨字段检索 TODO var res_merge []utils.DocIdInfo if len(res_list) == 0 { terms := utils.RemoveDuplicatesAndEmpty(this.Segmenter.Segment(query, false)) //this.Logger.Info("OUT TERMS :: %v ",terms) for index, term := range terms { l, ok := this.SearchFieldsByTerm(term) if !ok { return nil, false } if index == 0 { res_merge = l } else { res_merge, ok = utils.Interaction(res_merge, l) //this.Logger.Info("Interaction Term:%v Docids: %v",term,res_merge) if !ok { return nil, false } } } } return res_merge, true }