当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch'未能找到分析器'错误

贾兴学
2023-03-14

我试图让我的Elasticsearch索引使用Porter词干算法,但当我使用analyzeendpoint进行测试时,我的自定义分析器没有定义。

我已经查看了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令牌过滤器。

共有2个答案

梁丘宏硕
2023-03-14

您是否考虑过使用Python ES客户端而不是使用请求?

它可以让您轻松地操作与集群相关的一切:从创建索引、设置属性、执行查询等。

对于您的情况,您可以设置索引的设置或设置映射。只要使用正确的参数,一切都应该很好。

希望这有帮助:D

左翰海
2023-03-14

我认为这部分映射是错误的

更改此

'description': {
                        'type': 'text',
                        'analyzer': {
                            'porter_english': {
                                'type': 'custom',
                                'tokenizer': 'standard',
                                'stopwords': '_english_',
                                'filter': ['lowercase', 'porter_stem']
                            }
                        }
                    },

 'description': {
                 'type': 'text',
                  'analyzer': 'porter_english'    

  },

因为您已经在设置中定义了分析器。您只需要在映射中使用它

 类似资料:
  • 我正在开发一个ES插件,其中包含一个新的分析器和一个新的过滤器。我的elasticsearch。yml文件如下-: 同义词tokenfilterfactory是我的班级。 现在,当我使用 http://127.0.0.1:9200/newshuoshuo/_analyze?analyzer=ik_syno_smart 分析仪“ik\u syno\u smart”按预期工作。 但当我在映射调用中使用

  • 我对Kafka connect很陌生。我想把我的信息从Kafka主题推到弹性搜索。在阅读了可用的文档之后,我从发行版tar下载并编译了弹性搜索接收器。拉链(https://github.com/confluentinc/kafka-connect-elasticsearch/releases) 我添加了弹性搜索属性文件,并将上述jar包含在类路径中。当我在独立模式下运行kafka connect时

  • 我试图在我的网站中使用谷歌分析。我直接从谷歌分析网站复制了代码,并按照说明将其嵌入到我的超文本标记语言中。 以下是我的代码: 当我用这个脚本加载我的页面时,需要几秒钟。没有脚本,它几乎可以立即加载。这就是我如何知道问题出在Google Analytics(分析)代码中的原因。 页面最终加载后,会出现以下错误消息: 经过进一步调查,未找到的文件来自第5行的。 如何让此文件或脚本正常工作?

  • 问题内容: 我一直在与ElasticSearch一起玩我的一个新项目。我已将默认分析器设置为使用ngram tokenfilter。这是我的elasticsearch.yml文件: 我创建了一个新索引并向其中添加了以下文档: 但是,当我使用查询或任何其他部分术语进行搜索时,ElasticSearch不会返回此文档。仅当我搜索确切的字词(如)时,它才会返回文档。 我还尝试过更改配置文件,以便defa

  • 问题内容: 是否可以创建可按空间拆分索引然后创建两个令牌的自定义elasticsearch分析器?一是空间前的一切,二是空间。例如:我存储的记录字段包含以下文本:“ 35 G”。现在,我想通过仅在该字段中键入“ 35”或“ 35 G”查询来接收该记录。因此,Elastic应该创建两个令牌:[‘35’,‘35 G’],并且不再更多。 如果可能,如何实现? 问题答案: 可使用tokenizer实现。

  • 问题内容: 我在理解带轮胎宝石的elasticsearch中分析仪的概念时遇到了麻烦。我实际上是这些搜索概念的新手。这里有人可以帮我提供一些参考文章还是解释一下分析仪的实际作用以及为什么要使用它们? 我看到在Elasticsearch中提到了不同的分析器,例如关键字,标准,简单,滚雪球。没有分析仪的知识,我无法确定真正适合我的需求。 问题答案: 我给你一个简短的答案。 在索引时间和搜索时间使用分析