code: func (idx *InvertedIndex) SearchKeyValues(args ...types.KeyValues) ([]Document, error) {
  	q := make([]queryElement, len(args))
  
  	for i, arg := range args {
  		var keywords []Keyword
  		key := arg.KeyString()
  		if key == "" {
  			return nil, fmt.Errorf("index %q not valid", arg.Key)
  		}
  		conf, found := idx.getIndexCfg(key)
  		if !found {
  			return nil, fmt.Errorf("index %q not found", key)
  		}
  
  		for _, val := range arg.Values {
  			k, err := conf.ToKeywords(val)
  			if err != nil {
  				return nil, err
  			}
  			keywords = append(keywords, k...)
  		}
  
  		q[i] = newQueryElement(conf.Name, keywords...)
  
  	}
  
  	return idx.search(q...)
  }
docs: // SearchKeyValues finds the documents matching any of the keywords in the given indices.
  // The resulting document set will be sorted according to number of matches
  // and the index weights, and any matches with a rank below the configured
  // threshold (normalize to 0..100) will be removed.