Blame view

indexer/mapping_generator.py 3.37 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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
  # 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]:
      """
      Load Elasticsearch mapping from JSON file.
  
      Args:
          mapping_file: Path to mapping JSON file. If None, uses default.
  
      Returns:
          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
69
70
71
72
73
      if es_client.create_index(index_name, mapping):
          logger.info(f"Index '{index_name}' created successfully")
          return True
      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
92
93
94
95
96
      if es_client.delete_index(index_name):
          logger.info(f"Index '{index_name}' deleted successfully")
          return True
      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
117
118
119
120
121
      if es_client.update_mapping(index_name, mapping):
          logger.info(f"Mapping updated for index '{index_name}'")
          return True
      else:
          logger.error(f"Failed to update mapping for index '{index_name}'")
          return False