请求均为 POST 请求,Content-Type 为 application/json
curl -XPOST http://localhost:9200/books/_search
词条查询
仅匹配在给定字段中含有该词条的文档,而且是确切的未经分析的词条:
{
"query":{
"term":{
"title":"ElasticSearch"
}
}
}
由于是未经分析的,所以词条查询要提供跟索引文档中的词条完全匹配的词条。
多词条查询
多词条查询可以匹配多个词条。
下边的查询可以查 title 字段包含 ElasticSearch 或者 ES 的文档:
{
"query":{
"terms":{
"title":["ElasticSearch","ES"]
}
}
}
match查询
match 查询会将 query 参数中的值加以分析,然后进行查询。match 查询的词条分析时,是和建立索引时相同的分析器。
比如:
{
"query":{
"match":{
"word":"金牛"
}
}
}
查询结果为:
[{
"_index": "wildcard",
"_type": "english",
"_id": "AWFs0YF3FQ7g3z03lNKT",
"_score": 14.206823,
"_source": {
"word": "金牛座"
}
},
{
"_index": "wildcard",
"_type": "english",
"_id": "AWFukkLaFQ7g3z03lN2L",
"_score": 13.1050625,
"_source": {
"word": "金犀牛"
}
},
{
"_index": "wildcard",
"_type": "english",
"_id": "AWFs0YF3FQ7g3z03lNKh",
"_score": 8.327969,
"_source": {
"word": "抵牛"
}
}
]
这个查询 word 字段是分词的,所以查询结果中,含有“金”或“牛”,以及同时含有“金”、“牛“二字的都将被检索出。
mutil_match查询
mutil_match 和 match 类似,但其同时对多个字段进行查询,使用 fields 参数即可:
{
"query":{
"multi_match":{
"query":"金牛",
"fields":["word","name"]
}
}
}
query_string查询
query_string 查询支持全部的 Apache Lucene 查询语法,它使用一个查询解析器把提供的文本构建成实际的查询:
{
"query":{
"query_string":{
"default_field":"word",
"query":"金牛"
}
}
}
前缀查询
前缀查询,匹配特定字段以给定的前缀开始的文档:
{
"query":{
"prefix":{
"title":"Elastic"
}
}
}
标识符查询
标识符查询通过给定的文档唯一标识符来查找文档,查询只针对内部的 _uid 字段来查询,而不是 _id 字段,查询 json 报文体如下:
{
"query":{
"ids":{
"values":["AWFs0YF3FQ7g3z03lNKT","AWFs0YF3FQ7g3z03lNKi"]
}
}
}
也可以带上文档的类型 type 来查找集合中特定类型的文档:
{
"query":{
"ids":{
"type":"article",
"values":["AWFs0YF3FQ7g3z03lNKT","AWFs0YF3FQ7g3z03lNKi"]
}
}
}
通配符查询
通配符查询支持 ? 和 * 来通配字符:
{
"query":{
"wildcard":{
"title":"ElasticSear?h"
}
}
}
通配符查询不太注重性能,在可能时应尽量避免,特别是要避免前缀通配符(以通配符开始的词条)。
范围查询
范围查询使我们能够找到在某一字段值在某个范围里的文档,字段可以是数值型,也可以是基于字符串的(将映射到一个不同的Apache Lucene查询)。范围查询只能针对单个字段,查询参数应封装在字段名称中。
{
"query": {
"range": {
"year": {
"gte": 1700,
"lte": 1900
}
}
}
}
正则表达式查询
通过正则表达式查询,可以使用正则表达式来查询文本。
{
"query": {
"regexp": {
"title": {
"value": "Elasti.Searc[hk]",
"boost": 10.0
}
}
}
}