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

中使用它