面试题答案
一键面试text类型的'description'
- match查询适用场景:当需要进行全文搜索,比如在文章、描述等长文本中查找相关内容时适用。例如,在一篇商品描述中查找包含“高性能电脑”的记录。
- 底层原理:match查询会先对查询字符串进行分词处理,然后在倒排索引中查找分词后的各个词项。Elasticsearch会分析文本字段,通过分词器将文本拆分成一个个词项,然后构建倒排索引。查询时,同样对查询字符串分词,再在倒排索引中查找匹配的文档。
- 性能影响:由于涉及分词和多词项查找,在大数据量文本中查找时,性能相对较低,因为要处理多个词项的匹配,但这种方式灵活性高,适合复杂文本查询。
- term查询适用场景:一般不适合text类型,因为text类型数据默认会被分词,term查询是精确匹配未经分析的词项,对于已分词的text字段很难精确匹配到完整的原始文本。但如果text字段设置了keyword子字段,可对该子字段使用term查询进行精确匹配,如在设置了keyword子字段的商品描述中精确查找“this is a test sentence”这样完整的短语(前提是没有对该子字段再进行分词处理)。
- 底层原理:直接在倒排索引中查找与给定词项完全相同的记录,不进行分词。
- 性能影响:如果匹配到,速度很快,因为直接查找精确词项,但对于text类型本身默认的分词情况,很难匹配成功,不恰当使用会导致查不到数据。
keyword类型的'product_id'
- match查询适用场景:当需要进行模糊匹配或者部分匹配时适用。例如,在产品ID列表中查找以“prod_”开头的产品ID。
- 底层原理:会对查询字符串进行分词(虽然keyword类型一般不需要分词,但match查询默认会分词处理),然后在倒排索引中查找分词后的词项。对于keyword类型,虽然其本身是完整精确的,但match查询会按自己逻辑分词后查找。
- 性能影响:由于分词操作,可能会增加查询时间,尤其是数据量较大时,但能实现模糊匹配功能。
- term查询适用场景:当需要精确匹配产品ID时适用。比如查找产品ID为“prod_12345”的记录。
- 底层原理:直接在倒排索引中查找与给定产品ID完全相同的词项,因为keyword类型不会被分词,所以能精确匹配。
- 性能影响:性能较高,因为是精确查找,能快速定位到匹配的文档,在精确匹配需求下是高效的查询方式。
数字类型的'price'
- match查询适用场景:在进行范围查询或模糊数值匹配时适用。例如,查找价格在100到200之间的商品,或者查找价格包含“100”(类似文本模糊匹配概念)的商品(虽然实际场景可能较少这样的需求)。
- 底层原理:如果是范围查询,会在数字类型的倒排索引结构上进行范围查找,判断数值是否在给定范围内。如果是类似模糊匹配,可能对数字按一定规则转换为可分词形式(这种情况较少且不太常规)后再进行分词匹配。
- 性能影响:范围查询性能较好,因为数字类型索引结构利于范围查找;而模糊匹配数字的情况(如果有),性能会因分词和匹配操作受一定影响。
- term查询适用场景:当需要精确匹配某个价格时适用。比如查找价格为150的商品。
- 底层原理:在数字类型的倒排索引中直接查找与给定价格完全相同的记录。
- 性能影响:性能较高,能快速定位到精确匹配价格的文档,在精确数值匹配场景下是高效的查询方式。