搜索--基础工具
搜索形式:
1、结构化查询
2、全词查询
3、二者结合
三个概念:
Mapping: 在field中数据如何解释
Analysis: 全词在查询中是如何被处理的
Query DSL: 弹性、强大的查询语言
空查询
常见基本形式 GET /_search
{
"hits" : {
"total" : 14,
"hits" : [
{
"_index": "us",
"_type": "tweet",
"_id": "7",
"_score": 1,
"_source": {
"date": "2014-09-17",
"name": "John Smith",
"tweet": "The Query DSL is really powerful and flexible",
"user_id": 2
}
},
... 9 RESULTS REMOVED ...
],
"max_score" : 1
},
"took" : 4,
"_shards" : {
"failed" : 0,
"successful" : 10,
"total" : 10
},
"timed_out" : false
}
应答解析:
hits区域:包含匹配的总数,hits数组包含前10个匹配的文档
_score字段:相关度分数
took: 显示操作执行整体时间
_shards: 查询中涉及的分片总数
time_out:提示查询是否超时;
GET /_search?timeout=10ms
多索引,多类型查询:
/_search ## 查询所有类型的指标
/gb/_search ## 查询某种所有的所有类型
/gb,us/_search ## 查询gb和us索引的所有类型
/g*,u*/_search ## 查询以g和u开头的所有索引的类型
/gb/user/_search ## 查询index为gb,type为user的
/gb,us/user,tweet/_search ## 查询在gb和us索引中的user和tweet类型
/_all/user,tweet/_search ## 查询类型为user和tweet
分页查询:
参数:
size和from
GET /_search?size=10
GET /_search?size=5&from=5
GET /_
查询精简版:
GET /_all/tweet/_search?q=tweet:elasticsearch
查询tweet字段中包含elasticsearch内容的document
查询 +name:john +tweet:mary的文档
GET /_search?q=%2Bname%3Ajohn+%2Btweet%3Amary
查询所欲包含mary的文档
GET /_search?q=mary
更复杂的查询
+name:(mary john) +date:>2014-09-10 +(aggregations geo)
映射和分析:
GET /_search?q=2014 # 12 results
GET /_search?q=2014-09-15 # 12 results !
GET /_search?q=date:2014-09-15 # 1 result
GET /_search?q=date:2014 # 0 results !
数据中只有一个document的date字段值为2014-09-15, 但是几次查询结构确不一样。
elasticsearch按照_all字段对数据进行索引和按照date进行索引是不同的,elasticsearch如何
解释document结构?
GET /gb/_mapping/tweet
{
"gb": {
"mappings": {
"tweet": {
"properties": {
"date": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"name": {
"type": "string"
},
"tweet": {
"type": "string"
},
"user_id": {
"type": "long"
}
}
}
Elasticsearch动态生成映射,基于猜测的字段类型。_all字段的类型是string,date类型和string类型索引
化结果不同。表示document字段类型和全词类型的不同导致查询结果不同
准确值VS全词
Elasticsearch中的数据宽泛的可用分为两类:准确值和全词
Foo不是foo的准确值,2014不是2014-09-15的准确值;
全词:文本数据,使用人类语言书写,例如邮件的正文。
准确值查询简单:判断是二段式,匹配还是不匹配
全词查询有些区别:文档如何匹配查询,针对给定的查询,相关度的值如何确定
全词查询很少做到全匹配,实际上想查询包含查询字段的文档;elasticsearch先分析词,然后使用结果
构建反向Index。
反向Index:
inverted index结构:允许快速全词查询,由所有document中的唯一单词列表组成;
案例:
两个document中都包含content字段:内容分别是:
1.The quick brown fox jumped over the lazy dog
2.Quick brown foxes leap over lazy dogs in summer
生成inverted index的步骤如下:
切割content的value为独立的单词,创建排序列表,列出每个document的出现
Term Doc_1 Doc_2
-------------------------
Quick | | X
The | X |
brown | X | X
dog | X |
dogs | | X
fox | X |
foxes | | X
in | | X
jumped | X |
lazy | X | X
leap | | X
over | X | X
quick | X |
summer | | X
the | X |
-------------------------
当查询quick brown时,只需要知道在document中单词出现了
analysis:标记化和规则化的过程
analyzers:分析器,完成analysis,analyzers通常包装器,由三种功能组合:
字符过滤器,标记器,符号过滤器,
内置的analyzers:
Standard analyzer:
Simple analyzer:
Whitespace analyzer:
Language analyzers
查看当前Elasticsearch使用的analyzers
GET /_analyze
核心简单字段类型:
string | byte | short | integer | long | float | double | boolean | date
JSON类型 字段类型
Boolean boolean
完全数字 long
浮点 double
字符串,有效日期 date
字符串 string
Elastiscsearch搜索
最新推荐文章于 2021-07-08 13:49:22 发布