如何设计es的索引库结构

1、确定索引库的名称

建议和使用的数据库的表名相对应

比如:数据库的表名为

 那么索引库的名称可以为:item

2、确定索引库需要的字段

1.根据前端界面来判断需要什么字段

例如:

上边这个界面需要的就是:

分类,品牌,价格,商品图片,商品名称,评论数量,销量

除此之外,还需要

id,用于关键字全文检索的字段:all,用于自动补全的字段:suggestion,是否为推广广告:isAD

2.确定这些字段的属性

(图片不参与搜索,因此需要index为false)

分类:是字符串类型,且不可分词的,为keyword

品牌:是字符串类型,且不可分词的,为keyword

价格:是数值类型,为long

商品图片:存储的是网址,且不可分词的,为keyword

评论数量:是数值类型,为integer

销量:是数值类型,为integer

id:可以是long类型,也可以是keyword

all:因为搜索的时候,可以通过分类,商品名称,品牌进行搜索,所以为了提高效率,可以在床架索引库时,将这三个字段的内容复制一份到all字段,所以类型应该是可分词的文本text

suggestion:参与补全查询的字段必须是completion类型

isAD:只是保存是和否,所以是boolean(这个字段根据业务情况,可有可无)

3、根据上边分析的索引库结构创建索引库

es的索引库CRUD可以参考

http://t.csdn.cn/eSoyA

本例创建索引库的DSL语句为:

其中包含了自定义分词器,可以参考

http://t.csdn.cn/D7joj

# 商品数据索引库
PUT /item
{
  "settings": {
	"analysis": {
	  "analyzer": {
		"text_analyzer": {
		  "tokenizer": "ik_max_word",
		  "filter": "py"
		},
		"completion_analyzer": {
		  "tokenizer": "keyword",
		  "filter": "py"
		}
	  },
	  "filter": {
		"py": {
		  "type": "pinyin",
		  "keep_full_pinyin": false,
		  "keep_joined_full_pinyin": true,
		  "keep_original": true,
		  "limit_first_letter_length": 16,
		  "remove_duplicated_term": true,
		  "none_chinese_pinyin_tokenize": false
		}
	  }
	}
  },
  "mappings": {
	"properties": {
	  "id":{
		"type": "keyword"
	  },
	  "name":{
		"type": "text",
		"analyzer": "text_analyzer",
		"search_analyzer": "ik_smart",
		"copy_to": "all"
	  },
	  "price":{
		"type": "long"
	  },
	  "image":{
		"type": "keyword",
		"index": false
	  },
	  "category":{
		"type": "keyword",
		"copy_to": "all"
	  },
	  "brand":{
		"type": "keyword",
		"copy_to": "all"
	  },
	  "sold":{
		"type": "integer"
	  },
	  "commentCount":{
		"type": "integer"
	  },
	  "isAD":{
		"type": "boolean"
	  },
	  "suggestion":{
		  "type": "completion",
		  "analyzer": "completion_analyzer",
		  "search_analyzer": "keyword"
	  },
	  "all":{
		"type": "text",
		"analyzer": "text_analyzer",
		"search_analyzer": "ik_smart"
	  }
	}
  }
}
<think>首先,用户的问题是关于Elasticsearch索引库索引结构。我需要根据系统级指令来构建回答。关键系统级指令: -所有行内数学表达式必须使用$...$格式。但在这个上下文中,可能没有数学表达式,所以我可以忽略。-独立公式必须使用$$...$$格式并单独成段。同样,可能不适用。 -LaTeX语法正确:确保任何公式都正确。-使用中文回答:整个回答必须用中文。-生成相关问题:在回答结束时,添加相关问题。-回答中引用的段落末尾自然地添加引用标识:例如[^1]。-回答结构清晰,帮助用户逐步解决问题。 -保证回答真实可靠:基于提供的引用内容。 提供的引用内容: -[^1]:定义了Elasticsearch中的Schema(模式)主要是Mapping,它定义了索引中文档字段的结构、数据类型、存储和索引方式。Mapping就是Schema。 -[^2]:比较了Elasticsearch与MySQL的术语:索引类似表,文档类似行,字段类似列,Mapping类似Schema。 -[^3]:描述了mapping属性,包括type、index、analyzer、properties等。 -[^4]:类似[^3],列出了字段数据类型。 用户的问题:"我想了解Elasticsearch是否有索引库以及其索引结构是什么"基于引用:- Elasticsearch确实有索引库(Index),类似于数据库中的表。 -索引结构主要由Mapping定义,包括字段的类型、是否索引等属性。 回答结构:1.**确认索引库的存在**:解释Elasticsearch中的索引是什么。2.**解释索引结构**:详细描述Mapping及其属性。 3. **逐步解决问题**:从基本概念到细节。 4. **添加引用标识**:在相关句子末尾添加[^1],[^2]等。 5. **生成相关问题**:在结束部分添加相关问题。相关问题生成: -基于主题,生成3-4个相关问题,如:1.如何创建Elasticsearch索引库?2.Mapping属性的具体应用有哪些?3. Elasticsearch索引的性能优化方法?4.如何查询索引库中的文档?确保回答真实可靠:使用提供的引用内容,不要添加外部知识。最终回答大纲: -开头:直接回答用户问题。 -主体:-解释索引库:类似于数据库的表。-描述索引结构:Mapping定义字段。-列出常见Mapping属性。 -结尾:相关问题。</think>### Elasticsearch 索引库及其索引结构Elasticsearch 中,确实存在索引库(Index),它是文档(Document)的集合,类似于传统数据库中的表(Table)。索引库Elasticsearch 的核心组件,用于存储、检索和管理数据。索引结构主要由 Mapping(映射)定义,它类似于数据库的 Schema(模式),决定了文档字段的结构、数据类型、存储和索引方式[^1][^2]。下面我将逐步解释索引库的概念和索引结构,确保回答基于可靠引用。 #### 1. **索引库的概念** - **索引库是什么?** 索引库Elasticsearch 中存储文档的逻辑容器。每个索引库对应一个或多个分片(Shards),用于分布式存储数据。例如,创建一个名为 "products" 的索引库,可以存储商品信息文档[^2]。 - 与传统数据库类比: - Elasticsearch 索引库 ≈ MySQL 的表(Table) - 文档(Document) ≈ 表中的行(Row) - 字段(Field) ≈ 表中的列(Column) - Mapping(映射) ≈ Schema(表结构)[^2] 这确保了数据的组织性和查询效率。 - **索引库的作用** 索引库支持高效的数据操作,包括: - 存储文档(如 JSON 格式的数据)。 - 支持全文搜索、聚合分析等。 - 通过分布式架构实现高可用和扩展性[^1][^3]。 #### 2. **索引结构:Mapping(映射)** 索引结构的核心是 Mapping,它定义了索引库中文档的约束规则。Mapping 指定了每个字段的数据类型、索引行为、分词方式等属性,确保数据的一致性和查询性能[^1][^3]。以下是 Mapping 的主要属性: - **字段数据类型(type)** Mapping 定义了字段的类型,常见类型包括: - 字符串:`text`(可分词的文本,适用于全文搜索)、`keyword`(精确值,适用于过滤或聚合,如品牌或国家)[^3][^4]。 - 数值:`long`、`integer`、`short`、`byte`、`double`、`float`(用于数值计算)。 - 布尔:`boolean`(true/false)。 - 日期:`date`(存储时间戳)。 - 对象:`object`(嵌套 JSON 结构)。 例如,一个商品索引库的 Mapping 可能包含 `name`(text 类型)、`price`(float 类型)等字段[^3][^4]。 - **索引行为(index)** 该属性控制字段是否被索引(默认为 `true`)。如果设置为 `false`,字段不会被搜索或聚合,但可存储原始数据(适用于不需要查询的字段)[^3]。 - **分词器(analyzer)** 对于 `text` 类型字段,指定分词器(如标准分词器或自定义分词器),影响文本如何被分词和搜索。例如,使用 `ik_smart` 分词器处理中文文本[^3]。 - **子字段(properties)** 用于定义嵌套字段或复杂对象。例如,一个 `address` 字段可能包含子字段 `city`(keyword 类型)和 `street`(text 类型)[^3]。 - **其他属性** 包括 `format`(日期格式)、`ignore_above`(忽略超长 keyword 字段)等,用于优化存储和查询[^1][^3]。 **示例 Mapping 结构**(以 JSON 格式表示): ```json { "mappings": { "properties": { "name": { "type": "text", "analyzer": "ik_max_word" }, // 可分词的文本字段 "brand": { "type": "keyword" }, // 精确值字段 "price": { "type": "float" }, // 数值字段 "created_at": { "type": "date", "format": "yyyy-MM-dd" } // 日期字段 } } } ``` 此 Mapping 确保 "name" 字段支持全文搜索,"brand" 字段用于精确匹配[^3][^4]。 #### 3. **索引库的创建与管理** - 创建索引库时,通常通过 REST API 定义 Mapping。例如: ```bash PUT /products { "mappings": { "properties": { "name": { "type": "text" }, "category": { "type": "keyword" } } } } ``` 这创建了一个名为 "products" 的索引库,并指定了字段结构[^2][^3]。 - 索引库支持动态 Mapping(Elasticsearch 自动推断字段类型)或静态 Mapping(用户显式定义),后者更可靠以避免数据不一致[^1]。 总之,Elasticsearch索引库是数据存储的基础单元,索引结构由 Mapping 严格定义,确保字段类型、索引行为等约束,从而优化搜索和分析性能[^1][^2][^3][^4]。如果您有具体场景(如电商搜索),我可以进一步解释如何设计索引
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值