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



我需要通过一个值数组进行搜索,每个值可以是简单的文本,也可以是带askeriks(*(的文本。例如:

["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"
}

当我用这个字符串MYULTRATEXT搜索时,我需要返回完全相同的name

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如何根据分析器分析文本,或检查您是否正确定义了分析器,Elasticearch具有可以使用的analyze API端点:https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-analyze.html

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

我有一个个人应用程序,我使用它可以更容易地与ANALYZE API交互并可视化结果。我试过你的例子,你可以在这里找到:Elasticsearch Analysis Inspector。

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

你想用"替换所有*的出现,下面的模式就可以了。。

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"
}
}
]
}
}

希望它能帮助

最新更新