MST
星途 面试题库

面试题:ElasticSearch中多字段映射属性设置在复杂搜索场景下的优化策略

假设你有一个电商产品索引,每个产品文档包含产品名称、描述、品牌等多个字段。对于产品名称字段,需要支持拼音搜索、同义词搜索以及不同语言的搜索。描述字段需要支持高亮显示和语义搜索。品牌字段主要用于聚合分析。请详细说明如何设置这些字段的映射属性,以满足上述复杂的搜索和分析需求,并解释每个设置的作用和原理。
14.0万 热度难度
数据库ElasticSearch

知识考点

AI 面试

面试题答案

一键面试

产品名称字段

  1. 拼音搜索
    • 设置:可以使用 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"
      }
    }
  }
}
- **作用与原理**:通过多字段,针对不同语言使用相应的语言分析器。不同语言分析器有各自的分词、词干提取等规则,能更好地处理对应语言的文本,提高不同语言搜索的准确性。

描述字段

  1. 高亮显示
    • 设置:在 Elasticsearch 中,字段类型设置为 text 即可,无需额外特殊映射设置。在查询时使用高亮参数。例如:
{
  "query": {
    "match": {
      "description": "查询词"
    }
  },
  "highlight": {
    "fields": {
      "description": {}
    }
  }
}
- **作用与原理**:Elasticsearch 在搜索匹配到文档后,会根据查询词在文档中定位相关文本,并按照设置的高亮格式(默认是 `<em>` 标签包裹)突出显示匹配的部分。因为 `text` 类型字段在索引时保留了位置信息,所以能准确高亮。

2. 语义搜索: - 设置:可以使用基于词向量的分析器或者预训练模型的嵌入向量。例如,在 Elasticsearch 中,可以使用 dense_vector 类型来存储嵌入向量:

{
  "description_embedding": {
    "type": "dense_vector",
    "dims": 768 // 根据预训练模型确定维度
  }
}

然后通过计算向量相似度进行语义搜索。 - 作用与原理:词向量或嵌入向量能将文本映射到低维向量空间,语义相近的文本在向量空间中距离较近。通过计算向量间的相似度(如余弦相似度),可以找到语义相似的文档,实现语义搜索。

品牌字段

  1. 聚合分析
    • 设置:将品牌字段设置为 keyword 类型。例如,在 Elasticsearch 中:
{
  "brand": {
    "type": "keyword"
  }
}
- **作用与原理**:`keyword` 类型字段不会进行分词,会将整个输入作为一个词条进行索引。这样在进行聚合分析(如按品牌统计产品数量)时,能准确地按照品牌进行分组,因为不会对品牌名称进行切分,保证了聚合的准确性。