Elasticsearch 'failed to find analyzer' 设置 API 未显示错误和分析器
Elasticsearch 'failed to find analyzer' error & analyzer not shown by Settings API
我正在尝试让我的 Elasticsearch 索引使用 Porter 词干提取算法,但是当我使用 _analyze
端点进行测试时,我的自定义分析器未定义。
我看了 ES 文档和关于 SO 的类似问题,我不确定问题出在哪里。我尝试在创建索引时对设置使用单独的 PUT 请求,但没有效果。
这是我创建映射的方式:
@staticmethod
def make_mapping():
mapping = {
'settings': {
'analysis':
{
'analyzer': {
'porter_english': {
'type': 'custom',
'tokenizer': 'standard',
'stopwords': '_english_',
'filter': ['lowercase', 'porter_stem']
}
}
}
},
'mappings': {
'properties': {
'published': {
'type': 'boolean'
},
'title': {
'type': 'text',
'analyzer': 'english'
},
'date': {
'type': 'date'
},
'description': {
'type': 'text',
'analyzer': {
'porter_english': {
'type': 'custom',
'tokenizer': 'standard',
'stopwords': '_english_',
'filter': ['lowercase', 'porter_stem']
}
}
},
'keywords': {
'type': 'text',
'analyzer': {
'porter_english': {
'type': 'custom',
'tokenizer': 'standard',
'stopwords': '_english_',
'filter': ['lowercase', 'porter_stem']
}
}
},
'price': {
'type': 'float'
}
}
}
}
return mapping
这是从映射创建索引的函数。
def init_elasticsearch():
es = elasticsearch.Elasticsearch(['http://localhost:9200'])
# idx_client = elasticsearch.client.IndicesClient(es)
for i in searchables.included:
index_name = camelTo_snake(i.__name__)
index_m = i.make_mapping()
index_uri = "{}/{}".format(current_app.config['ELASTIC_URI'], index_name)
create_index = requests.put(index_uri, json=index_m)
init_settings = requests.put(index_uri, json=index_m['settings'])
如果我查询设置,这就是我得到的全部内容:
>>> g = requests.get(e + '/gallery_item/_settings')
>>> g.text
'{
"gallery_item":{
"settings":{
"index":{
"creation_date":"1564789941204",
"number_of_shards":"1",
"number_of_replicas":"1",
"uuid":"SgkEBN4nTxWUCeSGWMwbGw",
"version":{"created":"7020099"},
"provided_name":"gallery_item"
}
}
}
}'
我只需要这两个字段即可使用 porter_stem
标记过滤器。
您是否考虑过使用 Python ES 客户端而不是使用请求?
它可以让您轻松操作与集群相关的一切:从创建索引、设置属性、执行查询等。
对于您的情况,您也可以 Set settings to your indices or Set mappings。只要使用正确的 args,一切都应该没问题。
希望这对您有所帮助 :D
我认为mappings
这部分是错误的
改变这个
'description': {
'type': 'text',
'analyzer': {
'porter_english': {
'type': 'custom',
'tokenizer': 'standard',
'stopwords': '_english_',
'filter': ['lowercase', 'porter_stem']
}
}
},
到
'description': {
'type': 'text',
'analyzer': 'porter_english'
},
因为您已经在 settings
中定义了分析器。您只需在 mappings
中使用它
我正在尝试让我的 Elasticsearch 索引使用 Porter 词干提取算法,但是当我使用 _analyze
端点进行测试时,我的自定义分析器未定义。
我看了 ES 文档和关于 SO 的类似问题,我不确定问题出在哪里。我尝试在创建索引时对设置使用单独的 PUT 请求,但没有效果。
这是我创建映射的方式:
@staticmethod
def make_mapping():
mapping = {
'settings': {
'analysis':
{
'analyzer': {
'porter_english': {
'type': 'custom',
'tokenizer': 'standard',
'stopwords': '_english_',
'filter': ['lowercase', 'porter_stem']
}
}
}
},
'mappings': {
'properties': {
'published': {
'type': 'boolean'
},
'title': {
'type': 'text',
'analyzer': 'english'
},
'date': {
'type': 'date'
},
'description': {
'type': 'text',
'analyzer': {
'porter_english': {
'type': 'custom',
'tokenizer': 'standard',
'stopwords': '_english_',
'filter': ['lowercase', 'porter_stem']
}
}
},
'keywords': {
'type': 'text',
'analyzer': {
'porter_english': {
'type': 'custom',
'tokenizer': 'standard',
'stopwords': '_english_',
'filter': ['lowercase', 'porter_stem']
}
}
},
'price': {
'type': 'float'
}
}
}
}
return mapping
这是从映射创建索引的函数。
def init_elasticsearch():
es = elasticsearch.Elasticsearch(['http://localhost:9200'])
# idx_client = elasticsearch.client.IndicesClient(es)
for i in searchables.included:
index_name = camelTo_snake(i.__name__)
index_m = i.make_mapping()
index_uri = "{}/{}".format(current_app.config['ELASTIC_URI'], index_name)
create_index = requests.put(index_uri, json=index_m)
init_settings = requests.put(index_uri, json=index_m['settings'])
如果我查询设置,这就是我得到的全部内容:
>>> g = requests.get(e + '/gallery_item/_settings')
>>> g.text
'{
"gallery_item":{
"settings":{
"index":{
"creation_date":"1564789941204",
"number_of_shards":"1",
"number_of_replicas":"1",
"uuid":"SgkEBN4nTxWUCeSGWMwbGw",
"version":{"created":"7020099"},
"provided_name":"gallery_item"
}
}
}
}'
我只需要这两个字段即可使用 porter_stem
标记过滤器。
您是否考虑过使用 Python ES 客户端而不是使用请求?
它可以让您轻松操作与集群相关的一切:从创建索引、设置属性、执行查询等。
对于您的情况,您也可以 Set settings to your indices or Set mappings。只要使用正确的 args,一切都应该没问题。
希望这对您有所帮助 :D
我认为mappings
这部分是错误的
改变这个
'description': {
'type': 'text',
'analyzer': {
'porter_english': {
'type': 'custom',
'tokenizer': 'standard',
'stopwords': '_english_',
'filter': ['lowercase', 'porter_stem']
}
}
},
到
'description': {
'type': 'text',
'analyzer': 'porter_english'
},
因为您已经在 settings
中定义了分析器。您只需在 mappings