当前位置: 首页 > 面试题库 >

在elasticsearchJava API中获取某些条件下的文档

雍宇定
2023-03-14
问题内容

据我所知,我们可以在elasticsearch中解析文档,并且当我们搜索关键字时,它将使用以下Java API代码返回文档:

  org.elasticsearch.action.search.SearchResponse searchHits =  node.client()
            .prepareSearch()
            .setIndices("indices")
            .setQuery(qb)
            .setFrom(0).setSize(1000)
            .addHighlightedField("file.filename")
            .addHighlightedField("content")
            .addHighlightedField("meta.title")
            .setHighlighterPreTags("<span class='badge badge-info'>")
            .setHighlighterPostTags("</span>")
            .addFields("*", "_source")
            .execute().actionGet();

现在我的问题是,假设某些文档具有如下字符串:

Jun 2010 to Sep 2011                First Document          
Jun 2009 to Aug 2011                Second Document             
Nov 2011 – Sep 2012                 Third Document   
Nov  2012- Sep 2013                 Forth Document   
Nov 2013 – Current                  First Document   
June 2014 – Feb 2015                Third Document   
Jan 2013 – Jan 2014                 Second Document   
July 2008 – Oct 2012                First Document   
May 2007 – Current                  Forth Document

现在,我希望出现以下情况的文件:

1 to 12 months
13-24 months
26-48 months

我该怎么做?


问题答案:

以这种形式索引文档时,Elasticsearch将无法正确地将这些字符串解析为日期。如果您将这些字符串转换为正确格式的时间戳记,则可以执行建议的查询的唯一方法是以这种格式索引这些文档

{
  "start": "2010-09",
  "end": "2011-10",
  // rest of the document
}

然后对它们运行脚本过滤的查询,然后使用Elasticsearch提供的一种脚本语言编译一个脚本,计算这两个日期之间的差值。请记住,脚本过滤和评分总是比简单的索引查找慢得多。

一种更快,更清洁的方法是,将时间段的长短与开始日期和结束日期一起编制索引,就像这样

{
  "start": "2010-09",
  "end": "2011-10",
  "duration": 13
  // the rest of the document
}

如果以这种形式索引文档,则只需在工期字段中执行过滤查询:

{
   "query":{
      "filtered":{
         "filter":{
            "and":[
               {
                  "range":{
                     "duration":{
                        "gte":1
                     }
                  }
               },
               {
                  "range":{
                     "duration":{
                        "lte":12
                     }
                  }
               }
            ]
         }
      }
   }
}


 类似资料:
  • 输出规则:对于一个项目,月,年,我们需要寻找下两个月,如果下两个月的总和(值)为0,那么它将符合输出条件。 对于Exapmle:对于A项,2020年8个月,总和(值)为0至2020年10个月。类似地,对于项目A,2020年9个月的总和(值)在接下来的两个月中是ot 0,所以它将不会产出。

  • 问题内容: 我编写了一些代码,这些代码将搜索目录并在列表框中显示文件。 我什至尝试过: 我虽然出错了… 好的,它说的Users\Hunter很好,当人们获得我的软件时,名字就没有猎人了。那么,我该如何将其命名为任何用户的下载文件夹? 问题答案: WinAPI方法SHGetKnownFolderPath是检索特殊文件夹(包括个人文件夹和下载文件夹)路径的唯一正确方法。 还有其他方法可以获得相似的结果

  • 我试图添加if-else语句来更改文本的颜色。然而,它并不能很好地工作。我希望只把40分以下的分数改成红色,但我不知道为什么我的文字都改成了红色。我能知道我犯了什么错误吗? 在if-else语句中,我编写了当标记低于40时更改文本颜色的代码。但是,它会将所有文本更改为红色。

  • 我的简化模式如下所示: 我想找到所有叫艾伦的人。我看了这个非常相似的问题,但它发现的是团队,而不是人。我想这里也是。即使我没有persons集合,是否有返回persons的查询? 我想我可以使用引用的技术找到团队,然后撤出他们的人员。我猜是这样的: 但是还有更直接的方法,对吗?

  • 问题内容: 我正在尝试使用Swift遍历放入Assets文件夹中的图像。我想遍历它们,然后将它们插入文件中,但是到目前为止,我还找不到如何获得类似的东西: 这可能吗?我一直在玩,但找不到任何东西。请告诉我。谢谢! 问题答案: Assets.xcassets不是文件夹,而是包含所有使用Assets.car作为其文件名的图像的存档。 如果你真的想读的资产文件,那么你需要使用一些库,可以提取像这样的文件

  • 项目中经常会生成一些Git系统不需要追踪(track)的文件。典型的是在编译生成过程中 产生的文件或是编程器生成的临时备份文件。当然,你不追踪(track)这些文件,可以 平时不用"git add"去把它们加到索引中。 但是这样会很快变成一件烦人的事,你发现 项目中到处有未追踪(untracked)的文件; 这样也使"git add ." 和"git commit -a" 变得实际上没有用处,同时