Blame view

indexer/mapping_generator.py 3.7 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__)
  
e4a39cc8   tangwang   索引隔离。 不同的tenant_i...
14
  # Default index name (deprecated, use get_tenant_index_name instead)
59b0a342   tangwang   创建手写 mapping JSON
15
16
17
18
19
20
  DEFAULT_INDEX_NAME = "search_products"
  
  # Default mapping file path
  DEFAULT_MAPPING_FILE = Path(__file__).parent.parent / "mappings" / "search_products.json"
  
  
e4a39cc8   tangwang   索引隔离。 不同的tenant_i...
21
22
23
24
25
26
27
28
29
30
31
32
33
  def get_tenant_index_name(tenant_id: str) -> str:
      """
      Generate index name for a tenant.
      
      Args:
          tenant_id: Tenant ID
          
      Returns:
          Index name in format: search_products_tenant_{tenant_id}
      """
      return f"search_products_tenant_{tenant_id}"
  
  
59b0a342   tangwang   创建手写 mapping JSON
34
  def load_mapping(mapping_file: str = None) -> Dict[str, Any]:
33839b37   tangwang   属性值参与搜索:
35
      """
59b0a342   tangwang   创建手写 mapping JSON
36
37
      Load Elasticsearch mapping from JSON file.
  
33839b37   tangwang   属性值参与搜索:
38
      Args:
59b0a342   tangwang   创建手写 mapping JSON
39
40
          mapping_file: Path to mapping JSON file. If None, uses default.
  
33839b37   tangwang   属性值参与搜索:
41
      Returns:
59b0a342   tangwang   创建手写 mapping JSON
42
43
44
45
46
47
48
49
50
51
52
53
          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
54
  
59b0a342   tangwang   创建手写 mapping JSON
55
56
57
58
59
60
61
62
      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
63
64
65
66
      """
      Create Elasticsearch index if it doesn't exist.
  
      Args:
bf89b597   tangwang   feat(search): ada...
67
          es_client: ESClient instance
be52af70   tangwang   first commit
68
          index_name: Name of the index to create
59b0a342   tangwang   创建手写 mapping JSON
69
          mapping: Index mapping configuration. If None, loads from default file.
be52af70   tangwang   first commit
70
71
72
73
  
      Returns:
          True if index was created, False if it already exists
      """
bf89b597   tangwang   feat(search): ada...
74
      if es_client.index_exists(index_name):
325eec03   tangwang   1. 日志、配置基础设施,使用优化
75
          logger.info(f"Index '{index_name}' already exists")
be52af70   tangwang   first commit
76
77
          return False
  
59b0a342   tangwang   创建手写 mapping JSON
78
79
80
      if mapping is None:
          mapping = load_mapping()
  
bf89b597   tangwang   feat(search): ada...
81
      if es_client.create_index(index_name, mapping):
33839b37   tangwang   属性值参与搜索:
82
83
          logger.info(f"Index '{index_name}' created successfully")
          return True
bf89b597   tangwang   feat(search): ada...
84
85
86
      else:
          logger.error(f"Failed to create index '{index_name}'")
          return False
be52af70   tangwang   first commit
87
88
89
90
91
92
93
  
  
  def delete_index_if_exists(es_client, index_name: str) -> bool:
      """
      Delete Elasticsearch index if it exists.
  
      Args:
bf89b597   tangwang   feat(search): ada...
94
          es_client: ESClient instance
be52af70   tangwang   first commit
95
96
97
98
99
          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...
100
      if not es_client.index_exists(index_name):
325eec03   tangwang   1. 日志、配置基础设施,使用优化
101
          logger.warning(f"Index '{index_name}' does not exist")
be52af70   tangwang   first commit
102
103
          return False
  
bf89b597   tangwang   feat(search): ada...
104
      if es_client.delete_index(index_name):
33839b37   tangwang   属性值参与搜索:
105
106
          logger.info(f"Index '{index_name}' deleted successfully")
          return True
bf89b597   tangwang   feat(search): ada...
107
108
109
      else:
          logger.error(f"Failed to delete index '{index_name}'")
          return False
be52af70   tangwang   first commit
110
111
112
113
114
115
116
  
  
  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...
117
          es_client: ESClient instance
be52af70   tangwang   first commit
118
119
120
121
122
123
          index_name: Name of the index
          new_fields: New field mappings to add
  
      Returns:
          True if successful
      """
bf89b597   tangwang   feat(search): ada...
124
      if not es_client.index_exists(index_name):
325eec03   tangwang   1. 日志、配置基础设施,使用优化
125
          logger.error(f"Index '{index_name}' does not exist")
be52af70   tangwang   first commit
126
127
128
          return False
  
      mapping = {"properties": new_fields}
bf89b597   tangwang   feat(search): ada...
129
      if es_client.update_mapping(index_name, mapping):
33839b37   tangwang   属性值参与搜索:
130
131
          logger.info(f"Mapping updated for index '{index_name}'")
          return True
bf89b597   tangwang   feat(search): ada...
132
133
134
      else:
          logger.error(f"Failed to update mapping for index '{index_name}'")
          return False