elasticsearch - 使用分析器搜索时如何排除星号

标签 elasticsearch elasticsearch-analyzers

我需要按值数组进行搜索,每个值可以是简单文本,也可以是带有Askterisks(*)的文本。
例如:
["MYULTRATEXT"]
我有下一个索引(我有一个非常大的索引,因此我将简化它):

................
{
    "settings": {
         "analysis": {
            "char_filter": {
              "asterisk_remove": {
                "type": "pattern_replace",
                "pattern": "(\\d+)*(?=\\d)",
                "replacement": "1$"
              }
            },
            "analyzer": {
              "custom_search_analyzer": {
                "char_filter": [
                  "asterisk_remove"
                ],
                "type": "custom",
                "tokenizer": "keyword"
              }
            }
        }
    },
        "mappings": {
        "_doc": {
            "properties": {
               "name": {
                  "type": "text",
                  "analyzer":"keyword",
                  "search_analyzer": "custom_search_analyzer"
               },
     ......................


并且索引中的所有数据都以星号*存储,例如:
curl -X PUT "localhost:9200/locations/_doc/2?pretty" -H 'Content-Type: application/json' -d'
{
   "name" : "MY*ULTRA*TEXT"
}

当我通过此字符串name搜索时,我需要返回完全相同的MYULTRATEXT
curl -XPOST 'localhost:9200/locations/_search?pretty' -d '
{
  "query": { terms: { "name": ["MYULTRATEXT"] }  }
}'


它应该返回MY*ULTRA*TEXT,但不起作用,因此找不到解决方法。有什么想法吗?

我尝试了pattern_replace,但似乎我做错了什么,或者我在这里错过了什么。

所以我需要在搜索时将所有*替换为空``

最佳答案

您提供的正则表达式和替换模式似乎有问题。

我认为您想要的是:

            "char_filter": {
              "asterisk_remove": {
                "type": "pattern_replace",
                "pattern": "(\\w+)\\*(?=\\w)",
                "replacement": "$1"
              }
            }

请注意以下更改:
  • \d => \w(匹配单词字符而不是数字)
  • 转义*,因为星号对正则表达式有特殊含义
  • 1$ => $1($<GROUPNUM>是您引用捕获的组的方式)

  • 要查看Elasticsearch将如何针对分析器分析文本,或者检查您是否正确定义了分析器,Elasticsearch具有您可以使用的ANALYZE API端点:https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html

    如果您使用当前的custom_search_analyzer定义尝试使用此API,则会发现“MY * ULTRA * TEXT”被分析为“MY * ULTRA * TEXT”,而不是您想要的“MYULTRATEXT”。

    我有一个个人应用程序,可用来更轻松地与ANALYZE API进行交互并可视化其结果。我尝试了您的示例,您可以在这里找到它:Elasticsearch Analysis Inspector

    关于elasticsearch - 使用分析器搜索时如何排除星号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58802431/

    相关文章:

    Elasticsearch 合并文档作为响应

    java - NoSuchMethodError : com. google.common.util.concurrent.MoreExecutors.directExecutor 在 Elasticsearch jar 上发生冲突

    elasticsearch - token 生成器是否可用于Elasticsearch中的索引编制或查询?

    elasticsearch - 无法使用分析器在复合查询中进行搜索

    javascript - 为什么我的ElasticSearch查询返回零文档?

    elasticsearch - kubernetes filebeat禁用指标监视

    python - ElasticSearch 的 Celery 结果类型

    elasticsearch - 找不到uri [/news]和方法[POST]的处理程序

    elasticsearch - 测试Elasticsearch自定义分析器-管道分隔关键字

    elasticsearch忽略搜索重音