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

为py elasticsearch dsl中的索引创建自定义分析器过滤器

公西俊能
2023-03-14

我正在为我的硕士使用py elasticsearch dsl,我正在土耳其标题语料库中创建标题文档索引,我需要为土耳其语言实现一个自定义的小写分析器:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lowercase-tokenfilter.html#analysis-小写令牌过滤器

我试着这样做:

turkish = analysis.token_filter('turkish_lowercase', type="lowercase", language="turkish")


turkish_lowercase = analyzer('turkish_lowercase',
    type = "custom",
    tokenizer="standard",
    filter=["turkish_lowercase"],
)

class Document(DocType):
    # title = Text()
    query = Percolator(
        analyzer=turkish_lowercase,
        filter=turkish
    )    # query is a percolator

    class Meta:
        index = 'titles' # index name
        doc_type = '_doc'

    def save(self, **kwargs):
        return super(Document, self).save(**kwargs)

但是我得到了这个错误:

python percolator.py                                        1 ↵  1736  17:37:54 
PUT http://localhost:9200/title-index [status:400 request:0.004s]
Traceback (most recent call last):
  File "percolator.py", line 55, in <module>
    Document.init()
  File "/home/salahaddin/Proyectos/Works/seminer/lib/python3.6/site-packages/elasticsearch_dsl/document.py", line 161, in init
    cls._doc_type.init(index, using)
  File "/home/salahaddin/Proyectos/Works/seminer/lib/python3.6/site-packages/elasticsearch_dsl/document.py", line 85, in init
    self.mapping.save(index or self.index, using=using or self.using)
  File "/home/salahaddin/Proyectos/Works/seminer/lib/python3.6/site-packages/elasticsearch_dsl/mapping.py", line 116, in save
    return index.save()
  File "/home/salahaddin/Proyectos/Works/seminer/lib/python3.6/site-packages/elasticsearch_dsl/index.py", line 219, in save
    return self.create()
  File "/home/salahaddin/Proyectos/Works/seminer/lib/python3.6/site-packages/elasticsearch_dsl/index.py", line 203, in create
    self.connection.indices.create(index=self._name, body=self.to_dict(), **kwargs)
  File "/home/salahaddin/Proyectos/Works/seminer/lib/python3.6/site-packages/elasticsearch/client/utils.py", line 76, in _wrapped
    return func(*args, params=params, **kwargs)
  File "/home/salahaddin/Proyectos/Works/seminer/lib/python3.6/site-packages/elasticsearch/client/indices.py", line 91, in create
    params=params, body=body)
  File "/home/salahaddin/Proyectos/Works/seminer/lib/python3.6/site-packages/elasticsearch/transport.py", line 314, in perform_request
    status, headers_response, data = connection.perform_request(method, url, params, body, headers=headers, ignore=ignore, timeout=timeout)
  File "/home/salahaddin/Proyectos/Works/seminer/lib/python3.6/site-packages/elasticsearch/connection/http_urllib3.py", line 163, in perform_request
    self._raise_error(response.status, raw_data)
  File "/home/salahaddin/Proyectos/Works/seminer/lib/python3.6/site-packages/elasticsearch/connection/base.py", line 125, in _raise_error
    raise HTTP_EXCEPTIONS.get(status_code, TransportError)(status_code, error_message, additional_info)
elasticsearch.exceptions.RequestError: TransportError(400, 'illegal_argument_exception', 'Custom Analyzer [turkish_lowercase] failed to find filter under name [turkish_lowercase]')

那么,正确的方法是什么?

谢谢你

共有1个答案

梁勇
2023-03-14

对于创建自定义过滤器,我们可以使用token_filter

turkish = analysis.token_filter('turkish_lowercase', type="lowercase", language="turkish")

我们正在为土耳其语语言创建一个新的lower_case过滤器。现在,我们需要创建分析器:

turkish_lowercase = analyzer('turkish_lowercase',
    type = "custom",
    tokenizer="standard",
    filter=[turkish],
)

我们将turkishfilter直接放在filter参数中,仅此而已;我们可以使用get_definition函数查看结果字典,filter作为analyzer

最后,我们在Document中应用该分析器:

class Document(DocType):
    title = Text(
        analyzer=turkish_lowercase,
        # filter=turkish
        )
    query = Percolator(
    )    # query is a percolator

    class Meta:
        index = 'titles' # index name
        doc_type = '_doc'

    def save(self, **kwargs):
        return super(Document, self).save(**kwargs)

我们将得到下一个结果:

{
   "titles":{
      "aliases":{

      },
      "mappings":{
         "_doc":{
            "properties":{
               "query":{
                  "type":"percolator"
               },
               "title":{
                  "type":"text",
                  "analyzer":"turkish_lowercase"
               }
            }
         }
      },
      "settings":{
         "index":{
            "number_of_shards":"5",
            "provided_name":"titles",
            "analysis":{
               "filter":{
                  "turkish_lowercase":{
                     "type":"lowercase",
                     "language":"turkish"
                  }
               },
               "analyzer":{
                  "turkish_lowercase":{
                     "filter":[
                        "turkish_lowercase"
                     ],
                     "type":"custom",
                     "tokenizer":"standard"
                  }
               }
            },
            "number_of_replicas":"1",
         }
      }
   }
}
 类似资料:
  • 问题内容: 我使用以下命令通过请求创建索引: 但这返回以下错误: 我发送的json似乎有效。此错误的原因是什么? 我正在使用ES 2.2.0。 问题答案: 由于错误消息描述了自定义分析仪,例如 不是映射中选项的有效值。根据文档,它只能采用的值是 没有 不要将此字段值添加到索引中。使用此设置,该字段将不可查询。 not_analyzed 将字段值不变地添加到索引中,作为一项。这是所有支持此选项的字段

  • 问题内容: 我正在尝试找出使用TypeScript创建自定义角度过滤器的最佳方法。 我看到的所有代码示例都使用类似以下内容的代码: …可以,但是由于我想将所有过滤器代码分开而显得有些混乱。所以我想知道如何将过滤器声明为一个单独的文件(例如,filters / reverse- filter.ts),这样我就可以创建它: …以与控制器,服务等相同的方式 TS和Angular的文档在地面上似乎很薄,尤

  • 演示在网关追加一个header public class CustomFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 演示在网关追加heade

  • SOFARPC 提供了一套良好的可扩展性机制,为各个模块提供 SPI 的能力。 SOFARPC 对请求与响应的过滤链处理方式是通过多个过滤器 Filter 来进行具体的拦截处理,该部分可由用户自定义 Filter 扩展,自定义 Filter 的执行顺序在内置 Filter 之后。具体方式如下: Bolt Filter 新建自定义 Filter 。 public class CustomFilter

  • 问题内容: 如何使用带有此类JSON的NEST配置索引: 我可以使用类创建自定义分析器,但找不到如何创建自定义过滤器并将其注册到分析器中的方法。 提前致谢! 问题答案: 经过一番搜索,我找到了一个解决方案:

  • 因此,我一直在努力研究如何构建一种方法,使用用户输入过滤大量wordpress帖子。我不太确定我是否理解如何让它发挥作用。我会简单地解释我目前所知道的,也许有人能给我指出正确的方向。 所以我知道我可以使用wp_query($args)函数来查询我的数据库,并将我想要的过滤参数传递给它,以获得我想要的结果。现在,因为它必须由用户完成,我想我可以添加一个html表单,这样做 然后我写了如下的php代码