【问题标题】:Filter All using Elasticsearch使用 Elasticsearch 过滤所有
【发布时间】:2020-05-17 18:29:39
【问题描述】:

假设我有一个包含姓名、地址、年龄等字段的 User 表。该表中有 1000 多条记录,所以我使用 Elasticsearch 一次检索一页数据,20 条记录。

假设我只是想搜索一些文本“Alexia”,所以我想显示:是否有任何记录包含 Alexia?但特别的是,我想通过表格中的所有字段搜索此文本。

搜索文本是否与姓名字段或年龄或地址匹配?如果确实如此,它应该返回值。我们不会为 Elastic 查询传递任何特定字段。如果它返回与我的文本匹配的超过 20 条记录,则分页应该可以工作。

知道如何进行这样的查询吗?或任何连接 Elasticsearch 的方法?

【问题讨论】:

    标签: reactjs elasticsearch


    【解决方案1】:

    是的,你可以通过查询字符串来做到这一点

    {
      "size": 20,
      "query": {
        "query_string": {
          "query": "Alexia"
        },
        "range": {
          "dateField": {
            "gte": **currentTime** -------> This could be current time or age or any property that like to do a range query 
          }
        }
      },
      "sort": [
        {
          "dateField": {
            "order": "desc"
          }
        }
      ]
    }
    

    对于仅获取 20 条记录,您可以将大小传递为 20,对于分页,您可以使用 RangeQuery 并获取下一组消息

    {
      "size": 20,
      "query": {
        "query_string": {
          "query": "Alexia"
        },
        "range": {
          "dateField": {
            "gt": 1589570610732. ------------> From previous response 
          }
        }
      },
      "sort": [
        {
          "dateField": {
            "order": "desc"
          }
        }
      ]
    }
    

    【讨论】:

      【解决方案2】:

      您也可以使用match 查询来做同样的事情。如果在匹配查询中指定_all,它将搜索所有字段。

      {
        "size": 20,
        "query": {
          "match": {
            "_all": "Alexia"
          },
          "range": {
            "dateField": {
              "gte": **currentTime** 
            }
          }
        },
        "sort": [
          {
            "dateField": {
              "order": "desc"
            }
          }
        ]
      }
      

      当您使用 ElasticSearch 在搜索框中提供搜索功能时,应避免使用query_string,因为它会在语法无效的情况下抛出错误,而其他查询返回空结果。您可以从query_string 了解此内容。

      _all 已从 ES6.0 中弃用,因此如果您使用 6.x 以后的 ES 版本,您可以使用 copy_to 将字段的所有值复制到单个字段中,然后在该单个字段上进行搜索。更多内容可以参考copy_to

      对于分页,您可以使用fromsize 参数。 size 参数告诉您要检索多少个文档,from 告诉您要处理哪个命中。

      查询:

      {
        "from" : <current-count>
        "size": 20,
        "query": {
          "match": {
            "_all": "Alexia"
          },
          "range": {
            "dateField": {
              "gte": **currentTime** 
            }
          }
        },
        "sort": [
          {
            "dateField": {
              "order": "desc"
            }
          }
        ]
      }
      

      from 字段值您可以在每次迭代中逐步设置为您获得了多少文档。例如第一次迭代您可以将 from 设置为 0 。对于下一次迭代,您可以将其设置为21(因为在第一次迭代中您获得了前 20 次点击,而在第二次迭代中您希望在前 20 次点击后获得文档)。可以参考this

      【讨论】:

      • 但这对我不起作用。如果我想搜索一些数字示例需要找到 123 是否应该完全相同我的意思是如果我输入 12 并且无法得到结果?任何包含关键字都适用于数字搜索
      • @Oshini 您使用的是哪个 ES 版本?并且 Elasticsearch 默认分析测试字段而不是数字字段。您正在搜索的这个号码我可以知道它的数据类型是什么吗?如果是数字字段,则不会对其进行分析,在这种情况下,您需要搜索确切的术语。如果您想以这种方式搜索整数字段,则需要使用未对其进行分析的额外多字段。您也可以粘贴您的映射吗?以及您正在搜索的内容以及您需要的输出。
      • @Oshini 让我补充一点,12312 在技术上是不同的令牌,Elasticsearch 不够聪明,无法理解 12 在这种情况下意味着“123 的开始”。要明确地告诉它,您需要类似prefix query.
      • "id" : { "type" : "long" },
      • 我可以搜索我的任何我的意思是 23 或 12 应该允许显示记录。但是很长
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-13
      • 2012-08-03
      • 1970-01-01
      • 2012-08-30
      • 2016-12-04
      • 1970-01-01
      相关资源
      最近更新 更多