【问题标题】:Get document on some condition in elastic search java API在弹性搜索java API中获取某些条件下的文档
【发布时间】:2015-09-07 11:16:11
【问题描述】:

据我所知,我们可以在弹性搜索中解析文档,当我们搜索关键字时,它将使用 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

我该怎么做?

【问题讨论】:

  • 现在我可以在编制索引时阅读文档内容。有什么方法或者我们可以使用正则表达式来获取 'Jun 2010 to Sep 2011' 字符串?

标签: java elasticsearch elasticsearch-plugin


【解决方案1】:

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

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

随后对它们运行script-filtered 查询,编译一个脚本,使用 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
                     }
                  }
               }
            ]
         }
      }
   }
}

【讨论】:

  • 好的,谢谢。我也有同样的想法。这就是为什么我要问,我们如何使用正则表达式从 java 中的内容字符串中解析 ''Jun 2010 to Sep 2011'' 或 'Jun 2010 - Sep 2011' 字符串。
  • 如果月份有标准的 3 字母名称,您可以使用 Joda 时间库非常轻松地解析日期(请参阅 joda-time.sourceforge.net/apidocs/org/joda/time/format/…)。否则。我建议简单地将日期拆分为空间并编写一个简单的开关/案例将月份转换为数字。
  • 我试图在空间上分割日期,但在样本简历中,有些日期有 2 或 3 个空格。所以在那个时候是失败的。而且我对 JODA 图书馆没有任何经验。
猜你喜欢
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 2016-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
相关资源
最近更新 更多