我需要按值数组进行搜索,每个值可以是简单文本,也可以是带有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/