{ "email" => "john-6ren">
gpt4 book ai didi

ruby-on-rails - 在Ruby Elastic Search gem中转义@ at符号?

转载 作者:行者123 更新时间:2023-12-03 01:04:51 24 4
gpt4 key购买 nike

我在自定义ES“where”包装方法中有以下代码

filter: { term: params }

然后我们有一个样本ES文档,其中包含:
"emails" => { "email" => "johndoe@email.com" }

当我的搜索是:
query.where("emails.email" => "johndoe")

但是在以下情况下我没有结果:
query.where("emails.email" => "johndoe@email.com")

似乎在使用ES gem时我必须以某种方式逃脱符号吗?

最佳答案

这可能是因为您的字段是使用默认的标准分析器进行分析的,因此在@符号处被标记了。

您可以通过运行以下命令查看ES索引的内容:

curl -XGET 'localhost:9200/_analyze?analyzer=standard&pretty' -d 'johndoe@email.com' 

结果是
{
"tokens" : [ {
"token" : "johndoe",
"start_offset" : 0,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 1
}, {
"token" : "email.com",
"start_offset" : 8,
"end_offset" : 17,
"type" : "<ALPHANUM>",
"position" : 2
} ]
}

如您所见,您的电子邮件字段已被标记为两个不同的标记,这可能就是为什么搜索 johndoe起作用而搜索完整的电子邮件地址却不起作用的原因。

此处有几种解决方法,但一种可行的方法是根据 pattern_capture token filter创建自己的分析器,并将其用作 index_analyzer字段的 emails.email
{
"settings" : {
"analysis" : {
"filter" : {
"email" : {
"type" : "pattern_capture",
"preserve_original" : 1,
"patterns" : [ "([^@]+)", "(\\p{L}+)", "(\\d+)", "@(.+)" ]
}
},
"analyzer" : {
"email" : {
"tokenizer" : "uax_url_email",
"filter" : [ "email", "lowercase", "unique" ]
}
}
}
},
"mappings": {
"emails": {
"properties": {
"email": {
"type": "string",
"analyzer": "email" <-- use the analyzer here
}
}
}
}
}

在编制索引时,该分析器将产生以下所有标记,这些标记将使您可以搜索电子邮件地址的任何部分:
  • johndoe@email.com
  • johndoe
  • email.com
  • email
  • com
  • 关于ruby-on-rails - 在Ruby Elastic Search gem中转义@ at符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32105539/

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