【问题标题】:Hibernate Search for date休眠搜索日期
【发布时间】:2014-07-23 13:53:24
【问题描述】:

我在 Infinispan 中使用 Hibernate Search 4.4.0。我正在尝试搜索插入文档的日期。我已经将日期保存为字符串类型。

这是我班上日期的定义:

private String ins = Constants.dateFormat.format(new Date());

而日期格式是:

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");

现在我将这个字段映射为:

mapping.entity(Entity.class)
   .property("ins", ElementType.FIELD).field().analyze(Analyze.NO);

我已验证我的缓存中有日期属性为2012-09-17 14:28:32.0 的对象。但是当我使用如下查询时:

Query query = queryBuilder.keyword().onField("ins").matching("2012-09-17").creatQuery();

在缓存中搜索,没有结果。

是不是我搞砸了什么?

【问题讨论】:

  • 您是否使用 Luke 检查过索引的内容以查看 ins 字段中存储的值是什么?
  • 我检查了“ins”字段的值,好像在索引中输入“2012-09-17 14:28:32.0”。

标签: java hibernate hibernate-search infinispan


【解决方案1】:

我不是 Hibernate Search 方面的专家,但我认为不是

.analyze(Analyze.NO)

你应该写

.analyze(Analyze.NOT_TOKENIZED)

或类似

【讨论】:

  • Ty 响应,但我在 infinispan 中没有找到“NOT_TOKENIZED”选项。
  • 在我对“ins”字段使用分析器后,当我搜索“2012-09-17”时,它被分成了“2012”、“09”、“17”。但是查询没有找到任何结果。
  • 好的,那么Analyze.NO 似乎是正确的。尝试使用wildcardprefix 查询。当您查找matching("2012-09-17") 时,它会查找完全匹配,在您的情况下为2012-09-17 14:28:32.0。为了找到它,您需要运行查询2012-09-17*
  • @injecteer 说了什么。由于您的字段被存储到毫秒,您需要在QueryBuilder 中使用.wildcard() 子句。或者(这可能会更好),您可能想弄清楚索引存储时间的原因,并修复它以便它只是日期。 Hibernate Search 提供DateBridges 将Dates 转换为Strings,从而自动解析为您指定的精度。
猜你喜欢
  • 2012-09-30
  • 1970-01-01
  • 2011-11-17
  • 2021-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多