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

我需要按值数组进行搜索,每个值可以是简单文本,也可以是带有问号(*)的文本。 例如:

["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,但似乎我做错了什么,或者我在这里错过了什么。

因此我需要在搜索

时将所有*替换为空``
tianli12345 回答:使用分析器搜索时如何排除星号

这可能会对您有所帮助-问题在于您的正则表达式模式。

您想将所有*出现的位置替换为``下面的模式可以解决问题。

PUT my_index
{
  "mappings": {
    "doc": {
      "properties": {
        "name": {
          "type": "text","analyzer": "my_analyzer","search_analyzer":"my_analyzer"
        }
      }
    }
  },"settings": {
    "analysis": {
      "filter": {
        "asterisk_remove": {
          "type": "pattern_replace","pattern": "(?<=\\w)(\\*)(?=\\w)","replacement": ""
        }
      },"analyzer": {
        "my_analyzer": {
          "filter": [
            "lowercase","asterisk_remove"
          ],"type": "custom","tokenizer": "keyword"
        }
      }
    }
  }
}

分析查询

POST my_index/_analyze
{
  "analyzer": "my_analyzer","text": ["MY*ULTRA*TEXT"]
}

分析查询结果

{
"tokens": [
    {
      "token": "myultratext","start_offset": 0,"end_offset": 13,"type": "word","position": 0
    }
  ]
}

发布文档

POST my_index/doc/1
{
  "name" : "MY*ULTRA*TEXT"
}

搜索查询

GET my_index/_search
{
  "query": {
    "match": {
      "name": "MYULTRATEXT"
    }
  }
}

GET my_index/_search
{
  "query": {
    "match": {
      "name": "myultratext"
    }
  }
}

结果搜索查询

{
  "took": 3,"timed_out": false,"_shards": {
    "total": 1,"successful": 1,"skipped": 0,"failed": 0
  },"hits": {
    "total": 1,"max_score": 0.2876821,"hits": [
      {
        "_index": "my_index","_type": "doc","_id": "1","_score": 0.2876821,"_source": {
          "name": "MY*ULTRA*TEXT"
        }
      }
    ]
  }
}

希望有帮助

,

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

我认为您想要的是:

            "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”。 / p>

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

本文链接:https://www.f2er.com/3123852.html

大家都在问