面试题答案
一键面试索引结构设计
- 多语言处理:
- 对于不同语言的字段,使用Elasticsearch的多字段特性。例如,对于英文和中文文本,分别创建对应的字段,如
title.en
和title.zh
。每个字段采用适合该语言的分析器。英文可使用english
分析器,它会处理英文的词干、停用词等;中文可使用ik_max_word
或smartcn
分析器进行分词。 - 可以利用
_all
字段来进行跨语言的统一搜索,但在多语言环境下可能需要谨慎使用,因为它的分词可能无法很好地适应所有语言。更好的方式是使用copy_to
将不同语言的字段值复制到一个新的多语言搜索字段,例如title_all
,并对这个字段应用多语言分析器(如icu_analyzer
,它能处理多种语言的分词)。
- 对于不同语言的字段,使用Elasticsearch的多字段特性。例如,对于英文和中文文本,分别创建对应的字段,如
- 同义词处理:
- 创建同义词字典文件(如
synonyms.txt
),格式为word1,word2,word3
,其中word1
是原始词,word2
和word3
是它的同义词。 - 在索引设置中,定义一个包含同义词的自定义分析器。例如:
{ "settings": { "analysis": { "analyzer": { "my_synonym_analyzer": { "tokenizer": "standard", "filter": [ "my_synonym_filter", "lowercase" ] } }, "filter": { "my_synonym_filter": { "type": "synonym", "synonyms_path": "synonyms.txt" } } } } }
- 然后将这个自定义分析器应用到需要处理同义词的字段上。
- 创建同义词字典文件(如
查询语句构建
- 多语言查询:
- 使用
bool
查询来组合不同语言字段的查询条件。例如,要搜索标题中包含特定词的文档,查询如下:
{ "query": { "bool": { "should": [ { "match": { "title.en": "search_term" } }, { "match": { "title.zh": "搜索词" } } ] } } }
- 使用
- 同义词查询:
- 由于索引时已经对同义词进行了处理,在查询时直接使用普通的
match
查询即可。Elasticsearch会自动处理同义词匹配。例如:
这里{ "query": { "match": { "title_with_synonyms": "original_word" } } }
title_with_synonyms
是应用了包含同义词分析器的字段,它会匹配original_word
及其同义词。 - 由于索引时已经对同义词进行了处理,在查询时直接使用普通的
高亮显示的后处理逻辑
- 基本高亮设置:
- 在查询语句中添加
highlight
部分。例如:
这会对{ "query": { "match": { "title": "search_term" } }, "highlight": { "fields": { "title": {} } } }
title
字段中的匹配词进行高亮,默认使用<em>
标签包裹。 - 在查询语句中添加
- 处理多语言和同义词高亮:
- 多语言高亮:因为不同语言的分词方式不同,高亮结果可能会有差异。对于英文,高亮可能是单个单词;对于中文,可能是多个汉字组成的词。可以根据不同语言的特点,对高亮标签的位置进行微调。例如,对于中文,如果分词粒度较细,可能需要合并一些相邻的高亮标签,以保证语义的完整性。
- 同义词高亮:由于同义词在索引和查询时都已处理,高亮结果会包含同义词匹配的部分。但可能需要统一高亮的样式,避免因同义词来源不同导致高亮样式不一致。可以在获取到高亮结果后,通过代码统一替换高亮标签,例如将所有高亮部分都用
<span class="highlight">
包裹,而不管是原始词还是同义词的高亮。 - 语言感知高亮:在返回高亮结果前,检查文档的语言标记(可以在文档索引时添加一个语言字段
language
),根据语言选择合适的高亮后处理逻辑。例如,对于日语等语言,可能需要考虑其字符特性和分词结果来优化高亮显示。