我需要通过一个值数组进行搜索,每个值可以是简单的文本,也可以是带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"
}
}
]
}
}
希望它能帮助