gpt4 book ai didi

elasticsearch query_string 处理特殊字符

转载 作者:行者123 更新时间:2023-12-03 01:17:49 26 4
gpt4 key购买 nike

我的数据库与 Elasticsearch 同步,以优化我们的搜索结果并更快地请求。

我在查询用户时遇到问题,我想通过查询来查找我的用户,它可以是姓名、电话、IP、...

我的实际查询是

query_string: { fields: ['id', 'email', 'firstName', 'lastName', 'phone', 'ip'], query: `*${escapeElastic(req.query.search.toString().toLowerCase())}*`}

在哪里 req.query.search是我的搜索和escapeElastic来自节点模块 elasticsearch-sanitize因为我对一些符号有疑问。

我有一些问题,例如,如果我查询 ipv6,我会得到 query: '*2001\\:0db8*'但它不会在数据库中找到任何东西,它应该

其他问题,如果我有名字为 john-doe 的人,我的查询将是 query: '*john\\-doe*'它不会找到任何结果。

似乎转义可以防止查询错误,但在我的情况下会产生一些问题。

不知道有没有 query_string是满足我要求的更好方法,我愿意接受优化此查询的建议

谢谢

最佳答案

我怀疑您字段上的分析器是 standard 或类似的。这意味着像 : 这样的字符和 -被剥夺:

GET _analyze
{
"text": "John-Doe",
"analyzer": "standard"
}

显示
{
"tokens" : [
{
"token" : "john",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "doe",
"start_offset" : 5,
"end_offset" : 8,
"type" : "<ALPHANUM>",
"position" : 1
}
]
}

让我们创建自己的分析器,它将保留特殊字符,但同时将所有其他字符小写:
PUT multisearch
{
"settings": {
"analysis": {
"analyzer": {
"with_special_chars": {
"tokenizer": "whitespace",
"filter": [
"lowercase"
]
}
}
}
},
"mappings": {
"properties": {
"firstName": {
"type": "text",
"fields": {
"with_special_chars": {
"type": "text",
"analyzer": "with_special_chars"
}
}
},
"ip": {
"type": "ip",
"fields": {
"with_special_chars": {
"type": "text",
"analyzer": "with_special_chars"
}
}
}
}
}
}

摄取 2 个示例文档:
POST multisearch/_doc
{
"ip": "2001:0db8:85a3:0000:0000:8a2e:0370:7334"
}

POST multisearch/_doc
{
"firstName": "John-Doe"
}

并从上面应用您的查询:
GET multisearch/_search
{
"query": {
"query_string": {
"fields": [
"id",
"email",
"firstName.with_special_chars",
"lastName",
"phone",
"ip.with_special_chars"
],
"query": "2001\\:0db8* OR john-*"
}
}
}

两个命中都返回。

两点说明:1)注意我们正在搜索 .with_special_chars而不是主要字段和 2)我已经从 ip 中删除了前导通配符——这些都是非常低效的。

自从您询问优化建议以来的最后提示:查询可以重写为
GET multisearch/_search
{
"query": {
"bool": {
"should": [
{
"term": {
"id": "tegO63EBG_KW3EFnvQF8"
}
},
{
"match": {
"email": "john@doe.com"
}
},
{
"match_phrase_prefix": {
"firstName.with_special_chars": "john-d"
}
},
{
"match_phrase_prefix": {
"firstName.with_special_chars": "john-d"
}
},
{
"match": {
"phone.with_special_chars": "+151351"
}
},
{
"wildcard": {
"ip.with_special_chars": {
"value": "2001\\:0db8*"
}
}
}
]
}
}
}
  • 部分id匹配可能有点过头了——term捕获与否
  • email可以简单match
  • first- & lastName : 我怀疑 match_phrase_prefixwildcard 更高效或 regexp所以我会同意(只要你不需要领先的 * )
  • phone可以是match ed 但请确保也可以匹配特殊字符(如果您使用国际格式)
  • 使用 wildcard对于ip -- 与查询字符串中的语法相同

  • 试试上面的方法,看看你是否注意到任何速度改进!

    关于elasticsearch query_string 处理特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61640936/

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