目录
- 一、前言
- 二、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"},"pinyin":{"type":"text","analyzer":"pinyin_analyzer"}},"analyzer":"ts_match_analyzer"}"ts_match_analyzer":{"filter":["lowercase"],"char_fi