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

标签 elasticsearch

我试图重建我的 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/

相关文章:

elasticsearch - Elasticsearch 集群在 ECK 上丢失旧的 master 后不会选举新的 master

elasticsearch - Logstash MalformedCSVError:行内引用非法|如何配置logstash conf以读取多列mutiline CSV?

Elasticsearch - 查找缺少两个字段的文档

logging - Logstash 输入插件 : Redis vs Elasticsearch

elasticsearch - Fluentd无法连接到Elasticsearch-[警告]:#0 [elasticsearch]无法连接Elasticsearch或获取版本。假设Elasticsearch 5

node.js - 在Elasticsearch中使用nodejs创建索引时出错

elasticsearch - 操作功能计算的最终分数

postgresql - 模糊字符串匹配 : which tool?

php - 我在哪里可以分享我对 elasticsearch php 供应商的基准测试结果

java - elasticsearch:找不到索引数据(单元节点已关闭)