目录
- 一、前言
- 二、DSL的简单查询
- 1、相关字段的设置
- 2、match查询
- 3、match_all查询
- 4、term/terms等值查询
- 5、wildcard、prefix、fuzzy查询
- 6、正则(regexp)查询
- 7、组合(bool)查询
- 8、query_string查询
- 9、match_phrase查询
- 10、match_pharse_prefix查询
- 11、match_bool_prefix查询
- 12、multi_match查询
- 13、range查询
一、前言
ES中常见的查询类型分为简单查询、复合查询、聚合查询等。这里基于这些查询进行详细的介绍。
Elasticsearch DSL的简单查询操作如下:
**term查询**:单词查询,在字段的倒排索引(发生分词)或者直接在字段值(未发生分词)中查找条件值,只要找到这个条件值就算匹配上,得分为1。
**terms查询**:多个单词查询,效果为 多个 term 或者的逻辑。
**match查询**:分词后搜索。比如分词后有N个分词,只要匹配上其中一个就可以返回数据。根据文档中实际存储的字段类型(是否为分词文本 text,keyword 不会进行分词),决定是否对条件值进行分词;若未分词,直接以条件值执行 term 查询;若分词,则对条件值进行,分词处理:
(a)若得到一个词,也是执行term查询
(b)若得到多个词,默认执行 terms 查询(多个单词 或者关系)
(c)也可以手动指定为“且”关系(为且,倒排索引后的词表中要包含 条件分词后的 所有单词),通过以下方式指定 match 单词之间的关系。默认operator是or。
**match_phrase**:不做分词,以当前条件值到文档字段中进行“连续且位置顺序一致的”文本匹配。
**match_pharse_prefix**:同样是以 条件不做分词到文档字段中查询,但是条件最后的 单词不是必须匹配字段内的完整单词。【只要是一个前缀包含的连续文本就能匹配】例如 文档字段为 i love you 查询条件为 i love yo
match_phrase下无法匹配,因为 文档中 you 是一个完整的单词;match_pharse_prefix 就可以匹配。
**match_bool_prefix**:条件进行分词,执行 bool > should 查询。前面的词 做 term 查询,最后一个词做 perfix 查询。
**match_all查询**:查询所有数据【一般测试使用】。
全文检索(full text)查询:利用分词器对文本内容分词,然后倒排索引匹配【例如match_query, multi_match_query】。
**multi_match查询**:将条件应用到多个文档字段上进行匹配。
**精确查询**:根据精确词条值查找数据,一般是查找keyword、数值、日期、boolean等类型字段【例如ids, range, term】。
**wildcard查询(通配符查询)**:通配符查询,支持*和?。*:匹配 0 个或多个任意字符?:匹配 1 个任意字符
二、DSL的简单查询
为了更好的去理解ES简单查询操作的结果情况,我们要思考一个问题:
(1)、在实际查询时,往往有的字段进行查询匹配,时常无法搜索到数据,ES搜索匹配到底受哪些因素影响?
====为了说明更好的解释分析,需要相关字段进行mapping设置,具体结合字段的分词等属性,然后再结合简单查询操作,来有效分析查询结果。
1、相关字段的设置
knowledge_name字段
要查询的knowledge_name字段的ES设置属性如下
"knowledge_name": {"type": "text","fields": {"keyword": {"type": "keyword","ignore_above": 256,"normalizer": "lowercase_normalizer"