gpt4 book ai didi

elasticsearch - elasticsearch中特殊字符的处理

转载 作者:行者123 更新时间:2023-12-03 02:05:32 27 4
gpt4 key购买 nike

我使用以下分析器:

curl -XPUT 'http://localhost:9200/sample/' -d '
{
"settings" : {
"index": {
"analysis": {
"analyzer": {
"default": {
"type": "custom",
"tokenizer": "keyword",
"filter": ["trim", "lowercase"]}
}
}
}
}
}'

然后,当我尝试插入一些包含特殊字符(如 % 等)的文档时,它会转换为十六进制。
1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8 -> 实际值
1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8 

-> 存储值。

样本:
curl -XPUT 'http://localhost:9200/sample/strom/1' -d '{
"user" : "user1",
"message" : "1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8"
}'

仅当数据跨越数百万个文档时,问题才开始出现。早些时候,它按原样存储它。

现在,如果我尝试使用搜索,
1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8

它无法检索文档。我该如何处理?在将特殊字符转换为十六进制时,这种行为似乎是不确定的。

我无法在本地机器上复制相同的问题。

有人可以解释我犯的错误吗?

最佳答案

这不是我对文档进行标记的方式 with that analyzer :

curl -XGET localhost:9200/_analyze?tokenizer=keyword\&filters=trim,lowercase\&pretty -d '1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8'
{
"tokens" : [ {
"token" : "1%2fpjjp3jv2c24idfeu9xphbayxxh%2fdhtbmchb35sdznxo2g8vz4d7gtivy54imix_149c95f02a8",
"start_offset" : 0,
"end_offset" : 80,
"type" : "word",
"position" : 1
} ]
}

阅读上面的分析器输出,您的示例文本将转换为给定显示的分析器的单个小写但其他相同的标记。你确定没有角色过滤器在玩吗?这就是 HTML 编码的作用。

您应该能够将其运行为:
curl -XGET localhost:9200/sample/_analyze?field=message' -d 'text to analyze'

由于它没有直接使用分析器进行复制,因此我尝试通过创建一个索引来测试它来重现它:
curl -XPUT localhost:9200/indexed-analysis -d '
{
"settings": {
"number_of_shards" : 1,
"number_of_replicas" : 0,
"index": {
"analysis": {
"analyzer": {
"default": {
"type": "custom",
"tokenizer": "keyword",
"filter": ["trim", "lowercase"]
}
}
}
}
},
"mappings": {
"indexed" : {
"properties": {
"text" : { "type" : "string" }
}
}
}
}'

curl -XPUT localhost:9200/indexed-analysis/indexed/1 -d '{
"text" :
"1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8"
}'

curl -XGET localhost:9200/indexed-analysis/indexed/1?pretty

这产生了正确的、相同的结果:
{
"_index" : "indexed-analysis",
"_type" : "indexed",
"_id" : "1",
"_version" : 1,
"found" : true,
"_source":{
"text" : "1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8"
}
}

所以,我尝试了 _search为它,我找到了它。
curl -XGET localhost:9200/indexed-analysis/_search -d '{
"query": {
"match": {
"text": "1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8"
}
}
}'

结果:
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.30685282,
"hits": [
{
"_index": "indexed-analysis",
"_type": "indexed",
"_id": "1",
"_score": 0.30685282,
"_source": {
"text": "1%2fPJJP3JV2C24iDfEu9XpHBaYxXh%2fdHTbmchB35SDznXO2g8Vz4D7GTIvY54iMiX_149c95f02a8"
}
}
]
}
}

所有这些都导致了三种可能性:
  • 您的搜索分析器与索引分析器不同。这几乎总是会产生意想不到的结果。

    使用 default应该强制它同时用于读取和写入,但是您可以/应该验证它实际上正在被使用(而不是 default_indexdefault_search ):
  • curl -XGET /sample/_settings
  • curl -XGET /sample/_mapping

  • 如果您看到在 message 的映射中配置了分析器领域,那么这应该是一个危险信号。
  • 您有一个字符过滤器与索引字符串混淆(并且它可能对您的搜索字符串没有做同样的事情,因此指向#1)。
  • 您正在使用的 Elasticsearch 版本中有一个错误(希望没有,但您永远不知道)。上述所有测试都是针对 1.3.2 版本进行的。
  • 关于elasticsearch - elasticsearch中特殊字符的处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27080654/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com