Elasticsearch URL Search详解 电脑版发表于:2020/9/12 21:17 ![elasticsearch](https://img.tnblog.net/arcimg/hb/5f1adabe8df94fdb8331eb80e393c4a3.jpeg "elasticsearch") >#Elasticsearch URL Search详解 [TOC] 通过 URL Query 实现搜索 ------------ 举例: ```bash Get /movies/_search?q=2020&df=title&sort=year:desc&from=O&size=10&timeout=1s { "profile":true } ``` | 参数 | 意义 | | ------------ | ------------ | | `q` | 指定查询语句,使用 Query String Syntax。 | | `df` | 默认字段,不指定时,会对所有字段进行查询 | | `Sort` | 排序 / from 和 size 用于分页 | | `Profile` | 可以查看查询是如何被执行的 | 这里我们定义三条测试数据: ![](https://img.tnblog.net/arcimg/hb/0a1e3a03c72b486ba43213b3a371a54d.png) ![](https://img.tnblog.net/arcimg/hb/ed4c477ea46b4053979ccb8b541045b3.png) >###指定字段 v.s 泛查询 tn>这里我们通过指定`user`字段为`bob`进行查询 ```bash #指定字段的查询 GET /users/_search?q=Bob&df=user { "profile": "true" } GET /users/_search?q=user:Bob { "profile": "true" } ``` ![](https://img.tnblog.net/arcimg/hb/1d695062eb624df1a24542df572d2670.png) >接着在下面我们可以看到,它是通过`TermQuery`类型来进行查询的,查询时的查询格式为`user:bob` ![](https://img.tnblog.net/arcimg/hb/8b37ccc2ef0c45909c7db00dff6ec2d8.png) tn>这里我们把`trying`作为查询泛查询的查询参数 ```bash #泛查询 GET /users/_search?q=trying { "profile": "true" } ``` ![](https://img.tnblog.net/arcimg/hb/6a73a62dd7644519ba1f15b99d15a091.png) >接着在下面我们可以看到,它是通过`DisjunctionMaxQuery`类型来进行查询的,查询时的查询格式如下图所示;我们发现泛查询的查询格式有很多,同时当在数据量大的时候也会影响 Elasticsearch 的效率 ![](https://img.tnblog.net/arcimg/hb/82479b9be8ab44f6aac098807665fd4e.png) >###Term v.s Phrase 举例: tn>**Term类型**:Good Morning 等同于 Good 或(or) Morning tn>**Phrase类型**:"Good Morning" 等同于 Good 与(And) Morning。Phrase查询,还要求前后顺序保持一致 >Term类型 ```bash #使用引号,Phrase查询 GET /users/_search?q=message:out elasticsearch { "profile": "true" } ``` tn>查询出2条数据,但是我们发现它不仅仅通过`TermQuery`类型查询指定的字段进行查询,还通过了`DisjunctionMaxQuery`类型对所有的字段进行所有查询 ![](https://img.tnblog.net/arcimg/hb/0bf97326dfe84b9a94f62fcf37295005.png) ![](https://img.tnblog.net/arcimg/hb/b6795788923d496b855840806bf83b5e.png) ![](https://img.tnblog.net/arcimg/hb/317575bfcbac4f129ae1071dbbfb2bb8.png) tn>这里呢我们可以直接通过Bool进行查询 ```bash GET /users/_search?q=message:(out elasticsearch) { "profile": "true" } ``` ![](https://img.tnblog.net/arcimg/hb/a5c53aa5c15449b5bc1eeb0c32f34fd5.png) ![](https://img.tnblog.net/arcimg/hb/8d39ece0cb0741228bf7230aaaab0a60.png) >PhraseQuery类型 ```bash #使用引号,Phrase查询 GET /users/_search?q=message:"out elasticsearch" { "profile": "true" } ``` tn>如下图所示查询出两条数据,这里并且其中还为区分大小写。接着我们再通过调换一下顺序看看能否获取到? ![](https://img.tnblog.net/arcimg/hb/54e8ffd547d448ae80a63e6330f376e6.png) tn>获取到0条数据由此可以证明:Phrase查询,还要求前后顺序保持一致 ![](https://img.tnblog.net/arcimg/hb/854d63e3c06d4623bbf386828ec3595a.png) Query String Syntax ------------ - 布尔操作 - AND / OR / NOT 或者 && / || / ! - 必须大写 - title:(matrix Not reloaded) - 分组 - +表示 must - -表示 must_not - title:(+matrix -reloaded) tn>当我们需要message中既要有out又要有elasticsearch,我们就可以以And举例 ```bash GET /users/_search?q=message:(out AND elasticsearch) { "profile": "true" } ``` tn>当我们需要有out但不需要elasticsearch的时候,我们可以以Not举例 ```bash GET /users/_search?q=message:(out NOT elasticsearch) { "profile": "true" } ``` tn>当我们需要必要的参数时,结果同第一种查询结果一样。`%2B`表示`+`号,本句中必须要有的,是否包含out不一定。 ```bash GET /users/_search?q=message:(out NOT %2Belasticsearch) { "profile": "true" } ``` tn>当然除此之外还有范围查询以及算术查询 Query String Syntax(算术与范围) ------------ - 范围查询 - 区间表示:[]闭区间,{}开区间 - year:{2019 TO 2018} - year:[* TO 2018] - 算数符号 - year:>2010 - year:(>2010 && <=2018) - year:(+>2010 +<=2018) ```bash #范围查询 ,区间写法 GET /movies/_search?q=title:beautiful AND year:[2002 TO 2018] { "profile":"true" } ``` Query String Syntax(通配符查询,正则表达式,模糊匹配与近似查询) ------------ - 通配符查询(通配符查询效率低,占用内存大,不建议使用。特别是放在最前面) - ? 代表 1 个字符,* 代表 0 或多个字符 - title:mi?d - title:be* - 正则表达式 - title:[bt] - 模糊匹配与近似查询 - title:befutifl~1 - title:"lord rings"~2 ```bash #通配符查询 GET /movies/_search?q=title:b* { "profile":"true" } //模糊匹配&近似度匹配 GET /movies/_search?q=title:beautifl~1 { "profile":"true" } GET /movies/_search?q=title:"Lord Rings"~2 { "profile":"true" } ```