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

弹性术语查询没有给出预期结果

汪晨
2023-03-14

我有一个索引,其中我的每个对象都有状态字段,该字段可以有一些预定义的值。我想获取所有状态为“已启动”、“已更新”、“已删除”的查询,任何与这些匹配的,因此我使用Querybuilder和nativeSearchQuery,通过ElasticsearchOperations在控制台上打印的java创建了这个查询:

 {
  "bool" : {
    "must" : [
      {
        "terms" : {
          "status" : [
            "INITIATED",
            "UPDATED",
            "DELETED"
          ],
          "boost" : 1.0
        }
      }
    ],
    "adjust_pure_negative" : true,
    "boost" : 1.0
  }
}

我的索引中有“INITIATED”状态的数据,但没有得到查询中提到的任何状态的人。请如何修复此查询?如果您需要任何东西,请告诉我。

更新:添加代码

NativeSearchQueryBuilder nativeSearchQueryBuilder=new NativeSearchQueryBuilder();
QueryBuildersingleQb=QueryBuilders.boolQuery().must(QueryBuilders.termsQuery("status",statusList));
                                        
  Pageable pageable = PageRequest.of(0, 1, Sort.by(Defs.START_TIME).ascending());
                FieldSortBuilder sort = SortBuilders.fieldSort(Defs.START_TIME).order(SortOrder.ASC); 
  nativeSearchQueryBuilder.withQuery(singleQb);
  nativeSearchQueryBuilder.withSort(sort);
  nativeSearchQueryBuilder.withPageable(pageable);
                nativeSearchQueryBuilder.withIndices(Defs.SCHEDULED_MEETING_INDEX);
                nativeSearchQueryBuilder.withTypes(Defs.SCHEDULED_MEETING_INDEX);
    
 NativeSearchQuery searchQuery = nativeSearchQueryBuilder.build();
 List<ScheduledMeetingEntity> scheduledList=elasticsearchTemplate.queryForList(searchQuery, ScheduledMeetingEntity.class);

更新2:样本数据:

I got this from kibana query on this index:
 "hits" : [
      {
        "_index" : "index_name",
        "_type" : "type_name",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "createTime" : "2021-03-03T13:09:59.198",
          "createTimeInMs" : 1614755399198,
          "createdBy" : "user1@domain.com",
          "editTime" : "2021-03-03T13:09:59.198",
          "editTimeInMs" : 1614755399198,
          "editedBy" : "user1@domain.com",
          "versionId" : 1,
          "id" : "1",
          "meetingId" : "47",
          "userId" : "129",
          "username" : "user1@domain.com",
          "recipient" : [
            "user1@domain.com"
          ],
          "subject" : "subject",
          "body" : "hi there",
          "startTime" : "2021-03-04T07:26:00.000",
          "endTime" : "2021-03-04T07:30:00.000",
          "meetingName" : "name123",
          "meetingPlace" : "placeName",
          "description" : "sfsafsdafsdf",
          "projectName" : "",
          "status" : "INITIATED",
          "failTry" : 0
        }
      }
    ]

共有1个答案

柯正谊
2023-03-14

确认映射:

GET/yourIndexName/\u映射

看看是否有效

您的映射需要有关键字才能使TermsQuery工作。

{
  "status": {
    "type" "text",
    "fields": {
      "keyword": {
        "type": "keyword",
        "ignore_above": 256
      }
    }
  }
}

当您第一次推送文档时,ES可以自动为您进行映射(无需您自己进行映射)。然而,如果你自己做映射,你可能有更好的控制。

无论哪种方式,都需要为状态字段定义关键字。

=============替代解决方案:(不区分大小写)

如果您有一个名为(状态)的字段,并且要搜索的值是(已启动、已更新或已删除)。

然后你可以这样做:

  BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery()
                .must(createStringSearchQuery());

public QueryBuilder createStringSearchQuery(){
            QueryStringQueryBuilder queryBuilder = QueryBuilders.queryStringQuery(" INITIATED OR UPDATED OR DELETED ");
            queryBuilder.defaultField("status");

     return queryBuilder;


}

打印QueryBuilder:

{
    "query_string" : {
      "query" : "INITIATED OR UPDATED OR DELETED",
      "default_field" : "status",
      "fields" : [ ],
      "type" : "best_fields",
      "default_operator" : "or",
      "max_determinized_states" : 10000,
      "enable_position_increments" : true,
      "fuzziness" : "AUTO",
      "fuzzy_prefix_length" : 0,
      "fuzzy_max_expansions" : 50,
      "phrase_slop" : 0,
      "escape" : false,
      "auto_generate_synonyms_phrase_query" : true,
      "fuzzy_transpositions" : true,
      "boost" : 1.0
    }
  }
 类似资料:
  • 这是我索引中的文档(也可以有几个): 从逻辑上讲,我试图建立这个条件: 我的问题(来自kibana): 我正在与上述范围内的字段的范围查询与上面的其他字段进行比较。但没有得到任何命中!我想检索具有在给定和日期。 在这个领域很缺乏经验,不知道为什么不起作用!请帮助如何修复此查询以做到这一点?

  • 我已经使用ES一段时间了,但今天不起作用。我重新创建了docker compose(smt可以在那里吗?),以下是我在ES中获得的数据: 编辑:这是我的输入(这里我有\u source=False) 架构: 具有“全部匹配”查询的文档(部分): 现在查询: 退货 知道问题出在哪里吗? 编辑:使用curl查询{“query”:{“bool”:{“must”:[{“match”:{“integer”:

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

  • 我正在尝试使用弹性搜索的内部点击功能来检索子文档内容。我的查询包含两个has_child子句,如下面的代码片段所示。我所观察到的是,我只获得了内部点击响应中属于第二个子子句的那些子内容。看起来最后的内部点击覆盖了第一个内部点击。 有什么方法可以同时获得内心的点击率吗? 下面是我使用的查询。

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