- 问题描述
- 源码分析
问题描述
已知查询query如下,Elasticsearch如果根据该字符串判断是哪种查询类型,如何对其进行解析?
(1)不带boost参数
{
"wildcard" :
{
"title" : "cr?me"
}
}
(2)带boost参数
{
"wildcard" :
{
"title" :
{
"value" : "cr?me",
"boost" : 20.0
}
}
}
源码分析
'''(1)测试代码'''
public void testWildcardQuery() throws IOException {
IndexQueryParserService queryParser = queryParser();
'''wildcard.json文件内容如问题描述中所示'''
'''此函数将文件内容读入String类型的字符串'''
String query = copyToStringFromClasspath("/org/elasticsearch/test/unit/index/query/wildcard.json");
'''对String类型的查询query进行解析---关键步骤'''
Query parsedQuery = queryParser.parse(query).query();
'''解析后得到的是WildcardQuery类的对象'''
assertThat(parsedQuery, instanceOf(WildcardQuery.class));
WildcardQuery wildcardQuery = (WildcardQuery) parsedQuery;
assertThat(wildcardQuery.getTerm(), equalTo(new Term("name.first", "sh*")));
}
'''(2)确定查询文本格式(JSON/SMILE/YAML)和文本解析器JsonXContentParser'''
public class IndexQueryParserService extends AbstractIndexComponent {
public ParsedQuery parse(String source) throws QueryParsingException {
XContentParser parser = null;
try {
'''1.根据source内容判断是JSON/SMILE/YAML类型的格式,
第一个字符是花括号即认为是JSON,
参考XContentFactory类方法xContentType(...)
2.根据类型格式返回相应的内容解析器,在此返回JsonXContentParser(implements XContentParser)'