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

当自定义分析器显式不使用Elasticsearch小写过滤器时,仍在应用该过滤器

宇文航
2023-03-14

我基本上是在尝试禁用小写过滤器,以便能够对文本字段进行区分大小写的匹配。按照索引和分析器文档,我创建了以下不带小写过滤器的映射:

PUT/my_索引

{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_custom_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "char_filter": [
            "html_strip"
          ],
          "filter": [
            "asciifolding"
          ]
        }
      }
    }
  }
}

我启用fielddata,以便在之后检查标记化

放置我的索引/\u映射/\u文档

{
  "properties": {
    "my_field": { 
      "type":     "text",
      "fielddata": true
    }
  }
}

我测试了自定义分析器,以确保它不像预期的那样是小写的

后 /my_index/analyze

{
  "analyzer": "my_custom_analyzer",
  "text": "Is this <b>déjà Vu</b>?"
}

得到以下响应

{
  "tokens": [
    {
      "token": "Is",
      "start_offset": 0,
      "end_offset": 2,
      "type": "<ALPHANUM>",
      "position": 0
    },
    {
      "token": "this",
      "start_offset": 3,
      "end_offset": 7,
      "type": "<ALPHANUM>",
      "position": 1
    },
    {
      "token": "deja",
      "start_offset": 11,
      "end_offset": 15,
      "type": "<ALPHANUM>",
      "position": 2
    },
    {
      "token": "Vu",
      "start_offset": 16,
      "end_offset": 22,
      "type": "<ALPHANUM>",
      "position": 3
    }
  ]
}

太好了,事情并没有像我想的那样变小。现在我试着插入相同的文本,看看会发生什么。

过帐/我的索引/\u文档

{
  "my_field": "Is this <b>déjà Vu</b>?"
}

然后试着查询回来

POST/my\u索引/\u搜索

{
  "query": {
    "regexp": {
      "my_field": "Is.*"
    }
  },
  "docvalue_fields": [
    "my_field"
  ]
}

没有点击率。现在如果我试着降低正则表达式,我得到

POST/my\u索引/\u搜索

{
  "query": {
    "regexp": {
      "my_field": "is.*"
    }
  },
  "docvalue_fields": [
    "my_field"
  ]
}

它返回

{
  "took": 6,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 1,
    "max_score": 1,
    "hits": [
      {
        "_index": "my_index",
        "_type": "_doc",
        "_id": "6d6PP20BXDCQSINU0RC_",
        "_score": 1,
        "_source": {
          "my_field": "Is this <b>déjà Vu</b>?"
        },
        "fields": {
          "my_field": [
            "b",
            "déjà",
            "is",
            "this",
            "vu"
          ]
        }
      }
    ]
  }
}

所以在我看来,由于只有小写的正则表达式匹配,并且doc值都以小写的形式返回,因此某些地方的事情似乎仍然在变得更低。我在这里做错了什么?

共有1个答案

岳枫
2023-03-14

到目前为止,良好的开端!!!

唯一的问题是,您没有将自定义分析器应用于您的字段。把你的映射改成这个,它会让你走得更远。

PUT my_index/_mapping/_doc
{
  "properties": {
    "my_field": { 
      "type":     "text",
      "fielddata": true,
      "analyzer": "my_custom_analyzer"       <-- add this
    }
  }
}
 类似资料:
  • 问题内容: 我已经下载了包含技能分类法的onet数据集,并将其上传到了Elasticsearch中。在技​​能分类中,有一些技能,例如c ++ 、. net,C#。我想给c#并且只获得c#的技能。通过检查一些链接,我已如下设置索引的映射和设置。 当我使用如下查询 我正在获得所有具有“ c”的技能 当我使用以下查询时假设应用了分析器 我得到空输出。我是否正确包括了分析仪,或者我的查询错误? 问题答案

  • 但是它返回的标记下面。 让我知道我在代码中遗漏了什么。

  • 本文向大家介绍详解AngularJS中$filter过滤器使用(自定义过滤器),包括了详解AngularJS中$filter过滤器使用(自定义过滤器)的使用技巧和注意事项,需要的朋友参考一下 1.内置过滤器 2.自定义过滤器     套用上面的格式定义两个简单的自定义过滤器一个带条件的,一个不带条件的。 (1)【不带条件】,功能:固定转换(有时候项目中会遇到角色代号,门店编码什么的,但是显示的时候

  • 问题内容: 我正在尝试搜索数据库,并能够使用大写/小写过滤器术语,但是我注意到在应用分析器时,我不知道如何在过滤后的搜索中应用小写分析器。这是查询: 我有一个小写的类型: 以及相应的映射: 问题答案: 问题是您在索引期间分析了一个字段以使其小写,但您正在对未分析的查询使用术语过滤器: 术语过滤器 筛选具有包含术语(未分析)的字段的文档。与术语查询类似,不同之处在于它充当过滤器。 http://ww

  • 演示在网关追加一个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