Skip to content

Instantly share code, notes, and snippets.

@search5
Created October 10, 2018 19:25
Show Gist options
  • Save search5/dd1ada4b6ddf2e95b5b61751a533fd3d to your computer and use it in GitHub Desktop.
Save search5/dd1ada4b6ddf2e95b5b61751a533fd3d to your computer and use it in GitHub Desktop.
#-*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from functools import partial
import codecs
import click
from xml.dom.minidom import parse
@click.command()
@click.argument('core')
def main(core):
solr_path = '/var/searchengine/solr-7.4.0/server/solr/{0}/conf/schema.xml'
tree = parse(solr_path.format(core))
def line_break(tree, space_width, new_line_count=1):
break_str = "\n" * new_line_count
break_str = "{0}{1}".format(break_str, " " * space_width)
return tree.createTextNode(break_str)
def createElement(tree, field_name, **options):
node = tree.createElement(field_name)
for attr_name, attr_value in options.items():
if attr_name.endswith("_"):
attr_name = attr_name[:-1]
node.setAttribute(attr_name, attr_value)
return node
break_node = partial(line_break, tree)
make_element = partial(createElement, tree)
# 마지막으로 정의된 fieldType 가져오기
last_field_type = tree.getElementsByTagName("fieldType")[-1]
# 줄바꿈 태그 만들기
# 새로운 필드 타입 생성
alpha_num_tag = make_element('fieldType', name='alphaNumeric',
sortMissingLast='false', omitNorms='true',
class_='solr.TextField')
last_field_type.parentNode.insertBefore(alpha_num_tag, last_field_type.nextSibling)
last_field_type.parentNode.insertBefore(break_node(4, 2), last_field_type.nextSibling)
alpha_num_tag.appendChild(break_node(8))
analyzer = tree.createElement('analyzer')
alpha_num_tag.appendChild(analyzer)
alpha_num_tag.appendChild(break_node(4))
analyzer.appendChild(break_node(12))
tokenizer = make_element('tokenizer', class_='solr.KeywordTokenizerFactory')
analyzer.appendChild(tokenizer)
analyzer.appendChild(break_node(12))
filter_lower = make_element('filter', class_='solr.LowerCaseFilterFactory')
analyzer.appendChild(filter_lower)
analyzer.appendChild(break_node(12))
filter_trim = make_element('filter', class_='solr.TrimFilterFactory')
analyzer.appendChild(filter_trim)
analyzer.appendChild(break_node(12))
filter_pattern = make_element('filter', class_='solr.PatternReplaceFilterFactory', pattern="(\d+)", replacement="00000$1", replace='all')
analyzer.appendChild(filter_pattern)
analyzer.appendChild(break_node(12))
filter_pattern = make_element('filter', class_='solr.PatternReplaceFilterFactory', pattern="0*([0-9]{6,})", replacement="$1", replace='all')
analyzer.appendChild(filter_pattern)
analyzer.appendChild(break_node(12))
filter_pattern = make_element('filter', class_='solr.PatternReplaceFilterFactory', pattern="([^a-z0-9])", replacement="", replace='all')
analyzer.appendChild(filter_pattern)
analyzer.appendChild(break_node(8))
# reg_no는 새로 추가한 fieldType으로 변경해야 함
# <field indexed="true" name="reg_no" stored="true" type="string"/>
field_elements = tree.getElementsByTagName('field')
for element in field_elements:
if element.getAttribute('name') == 'reg_no':
element.setAttribute('type', 'alphaNumeric')
tree.writexml(codecs.open(solr_path.format(core), 'w', 'utf-8'))
if __name__ == '__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment