Elasticsearch 호출 Lucene 조회 인터페이스 원본 분석 4: 어댑터 조회

7433 단어 elasticsearchLucene

Elasticsearch 호출 Lucene 조회 인터페이스 원본 분석 4: 어댑터 조회

  • 소개
  • 조회 문법
  • 원본 분석

  • 소개


    두 가지 와일드카드 지원: 물음표(?)및 별표().물음표(?) 사용 가능단일 문자의 와일드카드 질의를 수행하거나 별표(*)를 사용하여 여러 문자의 와일드카드 질의를 수행합니다.

    질의 문법


    예1, tiny 또는 tony를 검색하면 검색 문구't?ny'를 사용할 수 있습니다. {'query': {'wildcard': {'value':'t?ny'}}}}예2, 검색 Teach, Teacher와 Teaching을 사용할 수 있습니다. 검색 문구'Teach*': {'query': {'wildcard': {'title': {'value':'Teach*'}}}}}}}}}}}

    원본 분석

    '''(1)Elasticsearch code'''
    public class WildcardQueryParser implements QueryParser {
        public static final String NAME = "wildcard";
    
        @Override
        public Query parse(QueryParseContext parseContext) throws IOException, QueryParsingException {
            XContentParser parser = parseContext.parser();
    
            XContentParser.Token token = parser.nextToken();
            if (token != XContentParser.Token.FIELD_NAME) {
                throw new QueryParsingException(parseContext.index(), "[wildcard] query malformed, no field");
            }
            String fieldName = parser.currentName();
            String rewriteMethod = null;
    
            String value = null;
            float boost = 1.0f;
            token = parser.nextToken();
            if (token == XContentParser.Token.START_OBJECT) {
                String currentFieldName = null;
                while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
                    if (token == XContentParser.Token.FIELD_NAME) {
                        currentFieldName = parser.currentName();
                    } else {
                        if ("wildcard".equals(currentFieldName)) {
                            value = parser.text();
                        } else if ("value".equals(currentFieldName)) {
                            value = parser.text();
                        } else if ("boost".equals(currentFieldName)) {
                            boost = parser.floatValue();
                        } else if ("rewrite".equals(currentFieldName)) {
                            rewriteMethod = parser.textOrNull();
                        } else {
                            throw new QueryParsingException(parseContext.index(), "[wildcard] query does not support [" + currentFieldName + "]");
                        }
                    }
                }
                parser.nextToken();
            } else {
                value = parser.text();
                parser.nextToken();
            }
    
            if (value == null) {
                throw new QueryParsingException(parseContext.index(), "No value specified for prefix query");
            }
    
            BytesRef valueBytes;
            MapperService.SmartNameFieldMappers smartNameFieldMappers = parseContext.smartFieldMappers(fieldName);
            if (smartNameFieldMappers != null && smartNameFieldMappers.hasMapper()) {
                fieldName = smartNameFieldMappers.mapper().names().indexName();
                valueBytes = smartNameFieldMappers.mapper().indexedValueForSearch(value);
            } else {
                valueBytes = new BytesRef(value);
            }
            ''' Lucene WildcardQuery (Term("title","Teach*"))'''
            WildcardQuery query = new WildcardQuery(new Term(fieldName, valueBytes));
            ''' query , query , :Teach* Teach, Teacher   Teaching( ), , '''
            QueryParsers.setRewriteMethod(query, rewriteMethod);
            query.setRewriteMethod(QueryParsers.parseRewriteMethod(rewriteMethod));
            query.setBoost(boost);
            return wrapSmartNameQuery(query, smartNameFieldMappers, parseContext);
        }
    }
    
    '''(2)Lucene code'''
    public class WildcardQuery extends AutomatonQuery {
       ...
    }
    public class AutomatonQuery extends MultiTermQuery {
       ...
    }
    public abstract class MultiTermQuery extends Query {
        '''WildcardQuery MultiTermQuery, Elasticsearch '''
        public final Query rewrite(IndexReader reader) throws IOException {
        return rewriteMethod.rewrite(reader, this);
      }
    
    

    좋은 웹페이지 즐겨찾기