当前位置: 首页 > 知识库问答 >
问题:

Elasticsearch查询没有给出预期结果

魏毅
2023-03-14

这是我索引中的文档(也可以有几个):

{
        "_index" : "meeting",
        "_type" : "meeting",
        "_id" : "27",
        "_score" : 1.0,
        "_source" : {
          "createTime" : "2020-07-20T14:49:05.803",
          "createTimeInMs" : 1595234945803,
          "createdBy" : "sdf@sdfsd.com",
          "editTime" : "2020-07-20T14:49:05.803",
          "editTimeInMs" : 1595234945803,
          "editedBy" : "sfsf@sdfsdf.com",
          "versionId" : 1,
          "id" : "27",
          "projectId" : "62",
          "projectName" : "sdfsdf",
          "meetingName" : "meeting1",
          "agenda" : "string",
          "startDateString" : "2020-07-20T00:45:19.604",
          "userId" : 3,
          "memberList" : [
            3,
            4
          ],
          "status" : "ACTIVE",
          "timeZone" : "Asia/Dhaka",
          "startDate" : "2020-07-20T00:45:19.604",
          "endDate" : "2020-07-20T01:45:19.604",
          "dateInMS" : 1595227519000,
          "meetingPlace" : "string",
          "endDateString" : "2020-07-20T01:45:19.604"
        }
      }

从逻辑上讲,我试图建立这个条件:

if((projectId==62 && startDate>=inputFrom && startDate <=inputTo) && (status==ACTIVE ||status==POSTPONED))

我的问题(来自kibana):

GET /meeting/_search?pretty
{
  "query": 
  {
    "bool" : {
    "must" : [
      {
        "term" : {
          "projectId" : {
            "value" : "62",
            "boost" : 1.0
          }
        }
      },
      {
        "terms" : {
          "status" : [
            "ACTIVE",
            "POSTPONED"
          ],
          "boost" : 1.0
        }
      },
      {
        "range" : {
          "startDate" : {
            "from" : "2020-07-19T23:45:19.604Z",
            "to" : "2020-07-20T00:49:19.604Z",
            "include_lower" : true,
            "include_upper" : true,
            "boost" : 1.0
          }
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
  }
}

我正在与上述范围内的start Date字段的范围查询与上面的其他必须字段进行比较。但没有得到任何命中!我想检索具有start Date在给定范围内的文档从日期。
在这个领域很缺乏经验,不知道为什么不起作用!请帮助如何修复此查询以做到这一点?

共有1个答案

黄流觞
2023-03-14

您可以使用bool以这种方式组合多个查询。必须子句将作为逻辑AND工作,并确保所有条件都匹配。

返回包含规定范围内术语的文档,请参阅本ES官方文档中的范围查询

由于您没有为索引的数据提供任何映射,因此我没有为索引指定任何显式映射。

下面的搜索查询将根据问题中指定的条件为您提供预期结果。

搜索查询:

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "projectId": "62"
          }
        },
        {
          "range": {
            "startDate": {
              "gte": "2020-07-20T00:44:19.604",
              "lte": "2020-07-21T00:45:19.604"
            }
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "status.keyword": "ACTIVE"
                }
              },
              {
                "term": {
                  "status.keyword": "POSTPONED"
                }
              }
            ]
          }
        }
      ]
    }
  }
}
 类似资料:
  • 我有一个索引,其中我的每个对象都有状态字段,该字段可以有一些预定义的值。我想获取所有状态为“已启动”、“已更新”、“已删除”的查询,任何与这些匹配的,因此我使用Querybuilder和nativeSearchQuery,通过ElasticsearchOperations在控制台上打印的java创建了这个查询: 我的索引中有“INITIATED”状态的数据,但没有得到查询中提到的任何状态的人。请如

  • 我正在使用Spring data elasticsearch查询我的elastic文档。我的Elasticsearch实体类: 为了简洁起见,我还做了其他事情,比如设置存储库。数据搜索: Spring为上述调用生成的查询: 查询结果: 查看结果集,检查项目名称字段值,如包含方法!它没有检查完整的给定参数<为什么会这样?如何解决这些问题 Add:organizationId和projectName字

  • 动机:我正在设计一个access数据库来跟踪我员工的培训状态。每个员工都有基于其角色的培训要求(例如,行政助理必须接受记录管理培训和电话礼仪,而电工必须接受危险安全培训)。我希望能够生成一份报告,显示每个人所需的所有培训,以及完成的培训课程的完成日期。 模式I有以下表格: 人员——列出员工信息,例如姓名、电话、电子邮件;键: 我创建了一个查询来匹配到他们当前的: 这是正确的,并告诉我每个人当前的培

  • 我正在使用Standard ardAnalyser索引10个文本文档。 上面是用来索引文档的代码片段。出于测试目的,我正在搜索一个名为“灰烬”的字段。 当我使用QueryParser时,Lucene给出了预期的搜索结果。 但是,当我使用TermQuery API时,我没有得到所需的结果。我正在展示我为TermQuery所做的代码更改。 对stackoverflow本身做了一些研究,例如Lucene

  • 我有一个字段,使用空白标记器和小写和asciifolding过滤器进行分析。我试图运行一个同时包含前缀和通配符的查询。我们正在用ElasticSearch取代一个使用纯Lucene的本土搜索引擎,类似的查询确实使用Lucene语法,但在ElasticSearch中不起作用。 例如,该查询将查找在“name”字段中有“Smith John”的所有文档。 如果我省略引号,我会得到结果,但这包括在同一文