Blame view

indexer/mapping_generator.py 3.36 KB
be52af70   tangwang   first commit
1
  """
59b0a342   tangwang   创建手写 mapping JSON
2
  Elasticsearch mapping loader.
be52af70   tangwang   first commit
3
  
59b0a342   tangwang   创建手写 mapping JSON
4
  Loads Elasticsearch index mapping from JSON file.
be52af70   tangwang   first commit
5
6
7
  """
  
  from typing import Dict, Any
59b0a342   tangwang   创建手写 mapping JSON
8
  import json
325eec03   tangwang   1. 日志、配置基础设施,使用优化
9
  import logging
59b0a342   tangwang   创建手写 mapping JSON
10
  from pathlib import Path
be52af70   tangwang   first commit
11
  
325eec03   tangwang   1. 日志、配置基础设施,使用优化
12
13
  logger = logging.getLogger(__name__)
  
59b0a342   tangwang   创建手写 mapping JSON
14
15
16
17
18
19
20
21
  # Default index name
  DEFAULT_INDEX_NAME = "search_products"
  
  # Default mapping file path
  DEFAULT_MAPPING_FILE = Path(__file__).parent.parent / "mappings" / "search_products.json"
  
  
  def load_mapping(mapping_file: str = None) -> Dict[str, Any]:
a10a89a3   tangwang   构造测试数据用于测试分类 和 三种...
22
          """
59b0a342   tangwang   创建手写 mapping JSON
23
24
      Load Elasticsearch mapping from JSON file.
  
a10a89a3   tangwang   构造测试数据用于测试分类 和 三种...
25
          Args:
59b0a342   tangwang   创建手写 mapping JSON
26
27
          mapping_file: Path to mapping JSON file. If None, uses default.
  
a10a89a3   tangwang   构造测试数据用于测试分类 和 三种...
28
          Returns:
59b0a342   tangwang   创建手写 mapping JSON
29
30
31
32
33
34
35
36
37
38
39
40
          Dictionary containing index configuration (settings + mappings)
  
      Raises:
          FileNotFoundError: If mapping file doesn't exist
          json.JSONDecodeError: If mapping file is invalid JSON
      """
      if mapping_file is None:
          mapping_file = str(DEFAULT_MAPPING_FILE)
  
      mapping_path = Path(mapping_file)
      if not mapping_path.exists():
          raise FileNotFoundError(f"Mapping file not found: {mapping_path}")
be52af70   tangwang   first commit
41
  
59b0a342   tangwang   创建手写 mapping JSON
42
43
44
45
46
47
48
49
      with open(mapping_path, 'r', encoding='utf-8') as f:
          mapping = json.load(f)
  
      logger.info(f"Loaded mapping from {mapping_path}")
      return mapping
  
  
  def create_index_if_not_exists(es_client, index_name: str, mapping: Dict[str, Any] = None) -> bool:
be52af70   tangwang   first commit
50
51
52
53
      """
      Create Elasticsearch index if it doesn't exist.
  
      Args:
bf89b597   tangwang   feat(search): ada...
54
          es_client: ESClient instance
be52af70   tangwang   first commit
55
          index_name: Name of the index to create
59b0a342   tangwang   创建手写 mapping JSON
56
          mapping: Index mapping configuration. If None, loads from default file.
be52af70   tangwang   first commit
57
58
59
60
  
      Returns:
          True if index was created, False if it already exists
      """
bf89b597   tangwang   feat(search): ada...
61
      if es_client.index_exists(index_name):
325eec03   tangwang   1. 日志、配置基础设施,使用优化
62
          logger.info(f"Index '{index_name}' already exists")
be52af70   tangwang   first commit
63
64
          return False
  
59b0a342   tangwang   创建手写 mapping JSON
65
66
67
      if mapping is None:
          mapping = load_mapping()
  
bf89b597   tangwang   feat(search): ada...
68
      if es_client.create_index(index_name, mapping):
a10a89a3   tangwang   构造测试数据用于测试分类 和 三种...
69
70
      logger.info(f"Index '{index_name}' created successfully")
      return True
bf89b597   tangwang   feat(search): ada...
71
72
73
      else:
          logger.error(f"Failed to create index '{index_name}'")
          return False
be52af70   tangwang   first commit
74
75
76
77
78
79
80
  
  
  def delete_index_if_exists(es_client, index_name: str) -> bool:
      """
      Delete Elasticsearch index if it exists.
  
      Args:
bf89b597   tangwang   feat(search): ada...
81
          es_client: ESClient instance
be52af70   tangwang   first commit
82
83
84
85
86
          index_name: Name of the index to delete
  
      Returns:
          True if index was deleted, False if it didn't exist
      """
bf89b597   tangwang   feat(search): ada...
87
      if not es_client.index_exists(index_name):
325eec03   tangwang   1. 日志、配置基础设施,使用优化
88
          logger.warning(f"Index '{index_name}' does not exist")
be52af70   tangwang   first commit
89
90
          return False
  
bf89b597   tangwang   feat(search): ada...
91
      if es_client.delete_index(index_name):
a10a89a3   tangwang   构造测试数据用于测试分类 和 三种...
92
93
      logger.info(f"Index '{index_name}' deleted successfully")
      return True
bf89b597   tangwang   feat(search): ada...
94
95
96
      else:
          logger.error(f"Failed to delete index '{index_name}'")
          return False
be52af70   tangwang   first commit
97
98
99
100
101
102
103
  
  
  def update_mapping(es_client, index_name: str, new_fields: Dict[str, Any]) -> bool:
      """
      Update mapping for existing index (only adding new fields).
  
      Args:
bf89b597   tangwang   feat(search): ada...
104
          es_client: ESClient instance
be52af70   tangwang   first commit
105
106
107
108
109
110
          index_name: Name of the index
          new_fields: New field mappings to add
  
      Returns:
          True if successful
      """
bf89b597   tangwang   feat(search): ada...
111
      if not es_client.index_exists(index_name):
325eec03   tangwang   1. 日志、配置基础设施,使用优化
112
          logger.error(f"Index '{index_name}' does not exist")
be52af70   tangwang   first commit
113
114
115
          return False
  
      mapping = {"properties": new_fields}
bf89b597   tangwang   feat(search): ada...
116
      if es_client.update_mapping(index_name, mapping):
a10a89a3   tangwang   构造测试数据用于测试分类 和 三种...
117
118
      logger.info(f"Mapping updated for index '{index_name}'")
      return True
bf89b597   tangwang   feat(search): ada...
119
120
121
      else:
          logger.error(f"Failed to update mapping for index '{index_name}'")
          return False