面试题答案
一键面试产品名称字段
- 拼音搜索:
- 设置:可以使用
pinyin
分词器。例如,在 Elasticsearch 中,定义字段如下:
- 设置:可以使用
{
"product_name": {
"type": "text",
"analyzer": "pinyin_analyzer"
}
}
- **作用与原理**:`pinyin` 分词器会将中文文本转换为拼音,这样在搜索时,即使输入拼音也能匹配到相应的产品名称。它通过内置的拼音转换规则,对中文文本进行拼音切分,使得基于拼音的查询成为可能。
2. 同义词搜索: - 设置:定义同义词映射。在 Elasticsearch 中,可以这样设置:
{
"product_name": {
"type": "text",
"analyzer": "synonym_analyzer"
}
}
同时定义同义词分析器:
{
"analysis": {
"analyzer": {
"synonym_analyzer": {
"tokenizer": "standard",
"filter": ["synonym"]
}
},
"filter": {
"synonym": {
"type": "synonym",
"synonyms_path": "synonyms.txt"
}
}
}
}
在 synonyms.txt
文件中定义同义词对,如 apple, iphone
。
- 作用与原理:同义词分析器会在索引和查询时,将同义词替换为相同的词条,这样当搜索其中一个词时,能匹配到包含同义词的文档。在索引阶段,文本经过分词后,同义词过滤器会替换相关词;查询时同样处理,从而实现同义词搜索。
3. 不同语言搜索:
- 设置:可以使用多字段。例如,在 Elasticsearch 中:
{
"product_name": {
"type": "text",
"fields": {
"english": {
"type": "text",
"analyzer": "english"
},
"chinese": {
"type": "text",
"analyzer": "chinese"
}
}
}
}
- **作用与原理**:通过多字段,针对不同语言使用相应的语言分析器。不同语言分析器有各自的分词、词干提取等规则,能更好地处理对应语言的文本,提高不同语言搜索的准确性。
描述字段
- 高亮显示:
- 设置:在 Elasticsearch 中,字段类型设置为
text
即可,无需额外特殊映射设置。在查询时使用高亮参数。例如:
- 设置:在 Elasticsearch 中,字段类型设置为
{
"query": {
"match": {
"description": "查询词"
}
},
"highlight": {
"fields": {
"description": {}
}
}
}
- **作用与原理**:Elasticsearch 在搜索匹配到文档后,会根据查询词在文档中定位相关文本,并按照设置的高亮格式(默认是 `<em>` 标签包裹)突出显示匹配的部分。因为 `text` 类型字段在索引时保留了位置信息,所以能准确高亮。
2. 语义搜索:
- 设置:可以使用基于词向量的分析器或者预训练模型的嵌入向量。例如,在 Elasticsearch 中,可以使用 dense_vector
类型来存储嵌入向量:
{
"description_embedding": {
"type": "dense_vector",
"dims": 768 // 根据预训练模型确定维度
}
}
然后通过计算向量相似度进行语义搜索。 - 作用与原理:词向量或嵌入向量能将文本映射到低维向量空间,语义相近的文本在向量空间中距离较近。通过计算向量间的相似度(如余弦相似度),可以找到语义相似的文档,实现语义搜索。
品牌字段
- 聚合分析:
- 设置:将品牌字段设置为
keyword
类型。例如,在 Elasticsearch 中:
- 设置:将品牌字段设置为
{
"brand": {
"type": "keyword"
}
}
- **作用与原理**:`keyword` 类型字段不会进行分词,会将整个输入作为一个词条进行索引。这样在进行聚合分析(如按品牌统计产品数量)时,能准确地按照品牌进行分组,因为不会对品牌名称进行切分,保证了聚合的准确性。