我有一个索引,其中我的每个对象都有状态字段,该字段可以有一些预定义的值。我想获取所有状态为“已启动”、“已更新”、“已删除”的查询,任何与这些匹配的,因此我使用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
}
}
]
确认映射:
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
这是我的示例es索引文档: