gpt4 book ai didi

elasticsearch - 带有正则表达式的elasticsearch multi_match

转载 作者:行者123 更新时间:2023-12-02 23:24:07 25 4
gpt4 key购买 nike

我试图重建我的 flex 搜索查询,因为我发现没有收到要查找的所有文档。

因此,假设我有这样的文档:

{
"id": 1234,
"mail_id": 5,
"sender": "john smith",
"email": "johnsmith@gmail.com",
"subject": "somesubject",
"txt": "abcdefgh\r\n",
"html": "<div dir=\"ltr\">abcdefgh</div>\r\n",
"date": "2017-07-020 10:00:00"
}

我有几百万个这样的文档,现在我试图通过这样的查询来搜索一些文档:
{
"sort": [
{
"date": {
"order": "desc"
}
}
],
"query": {
"bool": {
"minimum_should_match": "100%",
"should": [
{
"multi_match": {
"type": "cross_fields",
"query": "abcdefgh johnsmith john smith",
"operator": "and",
"fields": [
"email.full",
"sender",
"subject",
"txt",
"html"
]
}
}
],
"must": [
{
"ids": {
"values": [
"1234"
]
}
},
{
"term": {
"mail_id": 5
}
}
]
}
}
}

对于这样的查询,一切都很好,但是当我想通过查询“gmail”或“com”查找文档时,它将无法工作。
"query": "abcdefgh johnsmith john smith gmail"
"query": "abcdefgh johnsmith john smith com"

只有当我搜索“gmail.com”时,它才能工作
“query”:“abcdefgh johnsmith john smith gmail.com”

所以...我试图附加分析仪
...
"type": "cross_fields",
"query": "abcdefgh johnsmith john smith",
"operator": "and",
"analyzer": "simple",
...

完全没有帮助。我能够找到此文档的唯一方法是定义正则表达式,例如:
"minimum_should_match": 1,
"should": [
{
"multi_match": {
"type": "cross_fields",
"query": "fdsfs wukamil kam wuj gmail.com",
"operator": "and",
"fields": [
"email.full",
"sender",
"subject",
"txt",
"html"
]
}
},
{
"regexp": {
"email.full": ".*gmail.*"
}
}
],

但是在这种方法中,我将不得不向我的json添加(查询*字段)正则表达式对象,因此我认为这不是最好的解决方案。我也知道通配符,但是就像正则表达式一样,它会很混乱。

如果有人遇到这样的问题并知道解决方案,我将非常感谢您的帮助:)

最佳答案

如果通过标准分析器运行搜索词,则可以看到johnsmith@gmail.com标记分解为哪些标记。您可以使用以下URL在浏览器中直接执行此操作:

https://<your_site>:<es_port>/_analyze/?analyzer=standard&text=johnsmith@gmail.com

这将显示电子邮件已分解为以下 token :
{

"tokens": [
{
"token": "johnsmith",
"start_offset": 0,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 1
},
{
"token": "gmail.com",
"start_offset": 10,
"end_offset": 19,
"type": "<ALPHANUM>",
"position": 2
}
]

}

因此,这表明您不仅可以使用 gmail进行搜索,而且可以使用 gmail.com进行搜索。要在点上也拆分文本,您可以更新映射以使用 Simple Analyzer,它说:

The simple analyzer breaks text into terms whenever it encounters a character which is not a letter. All terms are lower cased.



我们可以通过更新URL来使用简单的分析器来显示此作品,如下所示:
https://<your_site>:<es_port>/_analyze/?analyzer=simple&text=johnsmith@gmail.com

哪个返回:
{

"tokens": [
{
"token": "johnsmith",
"start_offset": 0,
"end_offset": 9,
"type": "word",
"position": 1
},
{
"token": "gmail",
"start_offset": 10,
"end_offset": 15,
"type": "word",
"position": 2
},
{
"token": "com",
"start_offset": 16,
"end_offset": 19,
"type": "word",
"position": 3
}
]

}

该分析器可能不适合该工作,因为它会忽略任何非字母值,但是您可以使用分析器和 token 生成器,直到获得所需的内容为止。

关于elasticsearch - 带有正则表达式的elasticsearch multi_match,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45210474/

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