面试题答案
一键面试索引结构设计
- 使用多字段映射:
- 对于每个需要匹配的信息(品牌、型号、颜色等),创建单独的字段。例如:
{ "mappings": { "properties": { "brand": { "type": "text", "analyzer": "standard" }, "model": { "type": "text", "analyzer": "standard" }, "color": { "type": "text", "analyzer": "standard" } } } }
- 这里使用
text
类型来处理文本内容,standard
分析器是Elasticsearch默认的分析器,它会将文本按词进行切分。对于一些特殊需求,如处理中文等,可以根据实际情况选择合适的分析器,如ik_max_word
(针对中文)。
- 增加副本和分片:
- 根据数据量和查询负载设置合适的分片和副本数量。例如,对于较大数据量且读操作较多的情况,可以设置多个分片和副本:
PUT /your_index_name?pretty { "settings": { "number_of_shards": 3, "number_of_replicas": 2 } }
- 这样可以提高查询性能和系统的可用性。
查询语句设计
- 使用Multi - match查询:
- 当用户输入短语时,使用
multi - match
查询多个字段,以提高匹配精准度。例如,假设用户搜索“红色苹果手机”:
{ "query": { "multi_match": { "query": "红色苹果手机", "fields": ["brand", "model", "color"], "type": "most_fields", "operator": "and" } } }
query
字段为用户输入的搜索短语。fields
指定要查询的字段,这里是品牌、型号和颜色字段。type
设置为most_fields
,表示在多个字段中查找,尽可能多的字段匹配到查询词。operator
设置为and
,表示匹配的文档必须同时包含查询短语中的所有词,这样可以提高匹配的精准度。如果设置为or
,则只要有一个词匹配即可,精准度会降低。
- 当用户输入短语时,使用
- 使用Phrase查询(如果需要严格短语匹配):
- 如果需要精确匹配短语顺序,可以对特定字段使用
match_phrase
查询。例如,假设要精确匹配颜色字段中的“红色苹果手机”:
{ "query": { "match_phrase": { "color": "红色苹果手机" } } }
- 这种查询会严格按照短语中的词序进行匹配,匹配到的文档会更符合用户意图,但匹配的文档数量可能相对较少。
- 如果需要精确匹配短语顺序,可以对特定字段使用
相关参数设置
- Boost参数:
- 可以为不同字段设置不同的
boost
值,以调整字段在匹配中的重要性。例如,如果品牌字段更重要,可以给它设置较高的boost
值:
{ "query": { "multi_match": { "query": "红色苹果手机", "fields": ["brand^3", "model", "color"], "type": "most_fields", "operator": "and" } } }
- 这里
brand^3
表示品牌字段的权重是其他字段的3倍,在计算文档相关性得分时,品牌字段匹配的文档得分会更高,从而优先展示。
- 可以为不同字段设置不同的
- Analyzer参数:
- 在查询时,可以指定与索引时相同的分析器,以确保查询词的分析方式与索引时一致。例如:
{ "query": { "multi_match": { "query": "红色苹果手机", "fields": ["brand", "model", "color"], "type": "most_fields", "operator": "and", "analyzer": "standard" } } }
- 这样可以避免因分析器不一致导致的匹配问题。