- 概述
- 源码分析
概述
Elasticsearch的查询语句中的一些域需要进一步调用Analyzer分析器进行分析,比如fuzzy_like_this查询、fuzzy_like_this_filed查询、more_like_this查询、more_like_this_field查询、multi_match查询等。在这些查询中,查询field包含多个值,如下例中需要搜索包含“crime publishment”的document。我们不能直接用“crime publishment”去索引中查找,需要对其运用Analyzer分析器进行分析。
{
"fuzzy_like_this" :
{
"fields": "title",
"like_text": "crime punishment",
"analyzer": "simple" #定义分析器,用于分析like_text字段
}
}
源码分析
'''(1)Elasticsearch:在解析查询语句时,获取分析器'''
public class FuzzyLikeThisQueryParser implements QueryParser {
public static final String NAME = "flt";
@Override
public Query parse(QueryParseContext parseContext) throws IOException, QueryParsingException {
XContentParser parser = parseContext.parser();
int maxNumTerms = 25;
float boost = 1.0f;
List<String> fields = null;
String likeText = null;
float minSimilarity = 0.5f;
int prefixLength = 0;
boolean ignoreTF = false;
'''分析器'''
Analyzer analyzer = null;
boolean failOnUnsupportedField = true;
XContentParser.Token token;
String currentFieldName = null;
while ((token = parser.nextToken()) != XContentParser.Token.END_OBJECT) {
if (token == XContentParser.Token.FIELD_NAME) {
currentFieldName = parser.currentName();
} else if (token.isValue()) {
if ("like_text".equals(c