目录
一、前言
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"