Query DSL
elasticsearch 提供一个使用java实现的REST Query DSL查询。查询的工厂方法是QueryBuilders。一旦你准备好了你就可以使用Search API.
import static org.elasticsearch.index.query.QueryBuilders.*;
注意 我们可以使用toString方法轻松的打印出JSON格式。
Match All Query
QueryBuilder qb = matchAllQuery();
注意匹配所有的,其中注意参数boost因子。
Full text queries
全文查询通常需要配合analyzer(或者search_analyzer)来进行特定领域的全文搜索(例如中文分词等相关插件)
全文查询包含:
match query
标准的全文查询匹配,包含模糊匹配和短语或者近似查询。详见Match Query
QueryBuilder qb = matchQuery(
"name", // 1
"kimchy elasticsearch" // 2
);
- 查询字段
- 查询文本
multi_match query
多字段匹配查询,详见Multi Match Query.
QueryBuilder qb = multiMatchQuery(
"kimchy elasticsearch", // 1
"user", "message" // 2
);
- 搜索的文本
- 使用的字段(可以有多个)
common_terms query
更专业查询,它提供了更多的不常见查询。 详见Common Terms Query
QueryBuilder qb = commonTermsQuery("name", // 1
"kimchy"); // 2
- 查询字段
- 查询值
query_string query
支持小型的Luence查询,使用字符串语法,你可以指定 AND 或 OR 或 NOT条件和一个多条件查询的搜索。仅限于专业用户使用。
QueryBuilder qb = queryStringQuery("+kimchy -elasticsearch"); // 1
- 查询文本
simple_query_string
一个更简单的,更强大的query_string语法查询,适合直接暴露给用户。
QueryBuilder qb = simpleQueryStringQuery("+kimchy -elasticsearch"); // 1
- 查询文本
注意这里解释下上面这个查询:
意思是”一定要有kimchy并且一定不含有elasticsearch”
参照Lucene语法规则http://www.oschina.net/question/1092_560
Term level queries 精确查询
While the full text queries will analyze the query string before executing, the term-level queries operate on the exact terms that are stored in the inverted index.
精确查询往往用于像数字、日期、以及枚举类型的查询而不是全文查询。或者它们允许你在低纬度上面执行分析工作。
精确查询包括
- term query
精确查询文本中包含的内容 - terms query
在指定的多个字段的中查找包含的内容(只要任意一个字段必然含有即可) - range query
范围查询,可以指定值所在的范围(日期、数字或者字符串) - exists query
查找某个字段不为空的值(等同于SQL的IS NOT NULL) - missing query
查找字段中是不是没有值或者只包含空值。详见Missing Query
java
QueryBuilder qb = missingQuery("user"); // 1
.existence(true) // 2
.nullValue(true); // 3
- 查询的字段
- existence查找user为空的值(设置为true时候匹配为空的,当然如果不存在user字段也会匹配到)
- nullValue查找user为null的值(设置为true时候匹配为null的值)
- prefix query
查找指定的字段中是否包含查询中的前缀。详见prefix query
java
QueryBuilder qb = prefixQuery(
"brand", //1
"heine" //2
);
- 查找的字段
- 前缀内容
Wildcard Query
通配符查询,找到指定的字段中包含查找的模式。该模式支持单个字符通配符(?)和多个字符通配符(*),类似SQL中的LIKE的语法。详见 Wildcard QueryQueryBuilder qb = wildcardQuery("user", "k?mc*");
- Regexp Query
正则查询。使用正则表达进行匹配查询,正则语法详见。详见Regexp Query
java
QueryBuilder qb = regexpQuery(
"name.first",
"s.*y");
Fuzzy Query
Find documents where the field specified contains terms which are fuzzily similar to the specified term. Fuzziness is measured as a Levenshtein edit distance of 1 or 2.
模糊查询.QueryBuilder qb = fuzzyQuery( "name", "kimzhy" );
type query
按照指定的类型查询QueryBuilder qb = typeQuery("my_type");
IDs Query
按照指定的类型和IDs进行查找QueryBuilder qb = idsQuery("my_type", "type2") .addIds("1", "4", "100"); QueryBuilder qb = idsQuery() // 1 .addIds("1", "4", "100");
- type是一个可选的。其中第一个查询表示在type为my_type和type2两个钟查找ids为1,4,100的值