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

向lucene搜索查询添加日期范围

申屠英韶
2023-03-14

我有一个lucene查询,可以对索引字段进行全文搜索。我想将日期范围添加到此查询。

我找到了这个问题并在那里使用了答案:如何在日期之间搜索(Hibernate搜索)?

但当我想在两个日期之间获取数据时,它什么也不返回。我使用的是MSSQL数据库,日期字段的类型是datetime。但它在实体类中被注释为@Temporal(TemporalType.TIMESTAMP)

这是我的实体类:

...
@Entity 
@Indexed
@FullTextFilterDef(name = "tarihAraligi", impl = Satislar.class)
@Table(name = "satislar")
@XmlRootElement
@NamedQueries({
@NamedQuery(name = "Satislar.findAll", query = "SELECT s FROM Satislar s"),
@NamedQuery(name = "Satislar.findById", query = "SELECT s FROM Satislar s      WHERE s.id = :id"),
@NamedQuery(name = "Satislar.findByAdet", query = "SELECT s FROM Satislar s WHERE s.adet = :adet"),
@NamedQuery(name = "Satislar.findByTarih", query = "SELECT s FROM Satislar s WHERE s.tarih = :tarih"),
@NamedQuery(name = "Satislar.findByUrunadi", query = "SELECT s FROM Satislar s WHERE s.urunadi = :urunadi"),
@NamedQuery(name = "Satislar.findByMusteriadi", query = "SELECT s FROM Satislar s WHERE s.musteriadi = :musteriadi"),
@NamedQuery(name = "Satislar.findByUrunkategori", query = "SELECT s FROM Satislar s WHERE s.urunkategori = :urunkategori"),
@NamedQuery(name = "Satislar.findByUrunfiyat", query = "SELECT s FROM Satislar s WHERE s.urunfiyat = :urunfiyat"),
@NamedQuery(name = "Satislar.findByUrunalis", query = "SELECT s FROM Satislar s WHERE s.urunalis = :urunalis")})
public class Satislar implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@DocumentId
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@Column(name = "adet")
private int adet;
@Basic(optional = false)
@Column(name = "tarih")
@Temporal(TemporalType.TIMESTAMP)
private Date tarih;
@Basic(optional = false)
@Column(name = "urunadi")
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String urunadi;
@Basic(optional = false)
@Column(name = "musteriadi")
@Field(index=Index.YES, analyze=Analyze.YES, store=Store.NO)
private String musteriadi;
@Basic(optional = false)
@Column(name = "urunkategori")
@Field(index=Index.YES, analyze=Analyze.NO, store=Store.NO)
private String urunkategori;
@Basic(optional = false)
@Column(name = "urunfiyat")
private int urunfiyat;
@Basic(optional = false)
@Column(name = "urunalis")
private int urunalis;
...

这就是我进行全文搜索的地方:

fullTextSession.beginTransaction();

    QueryBuilder b = fullTextSession.getSearchFactory()
            .buildQueryBuilder().forEntity(Satislar.class).get();

    Query luceneQuery
            = b.keyword()
            .wildcard()
            .onFields(fields)
            .matching(kelime + "*")
             .createQuery();


   Query datequery = b
    .range()
        .onField( "tarih" ).ignoreFieldBridge()
        .from( DateTools.dateToString( new Date(2015, 12, 18 , 17, 40, 40), DateTools.Resolution.MILLISECOND ) )
        .to( DateTools.dateToString( new Date(2015, 12, 26 , 17, 40, 40), DateTools.Resolution.MILLISECOND ) ).excludeLimit()
        .createQuery();

    org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(datequery);
    List<Satislar> kayitliSatislar = fullTextQuery.list();


    dtmSonuc.setRowCount(0);

    for (int i = 0; i < kayitliSatislar.size(); i++) {

        Satislar satis = kayitliSatislar.get(i);

        dtmSonuc.addRow(new String[]{satis.getMusteriadi(), satis.getUrunkategori(), satis.getUrunadi(),
            Integer.toString(satis.getAdet()), Integer.toString(satis.getUrunfiyat()), satis.getTarih().toString()});

    }

有两种不同的查询。一个是在指定字段上进行全文通配符搜索,它可以工作。另一个应该进行范围搜索,但它不起作用

我有三个问题:

1-我使用的是MSSQL db,日期字段的类型是datetime。但它在实体类中被注释为@Temporal(TemporalType.TIMESTAMP)。这是个问题吗?

2-为什么范围搜索不起作用?

3-我可以将全文搜索与范围搜索结合起来吗?

共有1个答案

葛承德
2023-03-14

尝试将此注释添加到日期字段:

@Basic(optional = false)
@Column(name = "tarih")
@Temporal(TemporalType.TIMESTAMP)
@DateBridge(resolution = Resolution.DAY)
private Date tarih;

如果仍然不起作用,请尝试使用Lucene本机查询,如下所示:

TermRangeQuery luceneRangeDateQuery = new TermRangeQuery(fieldName, DateTools.dateToString(from, DateTools.Resolution.DAY), 
                DateTools.dateToString(to, DateTools.Resolution.DAY), true, true);

这总是有效的。(您可以将DateTools.Resolution.DAY更改为小时、秒、年…)

 类似资料:
  • 我使用Lucene 6.3,但我无法找出以下非常基本的搜索查询有什么问题。它只是添加到具有单个日期范围的文档中,然后尝试在更大的范围内搜索,应该可以找到两个文档。什么是错的? 有内联注释应该使示例非常不言自明。如果有什么不清楚的地方,请告诉我。 请注意,我的主要要求是能够执行日期范围查询以及其他字段查询,例如 这是在观看了Lucene空间深潜视频介绍之后,介绍了DateRangePrefix Tr

  • 我的任务是使用lucene在我们的产品表中搜索。我已经创建了一个索引,正在使用带有多个字段的QueryParser进行搜索,但结果不是我所需要的。我有一个存储为LM10的产品,但如果搜索词是LM 10,我希望能够找到它,但如果搜索词是Fred LM10或Fred LM 10,它也必须能够匹配。你知道我如何在Lucene做到这一点吗。 提前谢谢

  • 我尝试创建一个查询,显示入住和退房日期之间的可用酒店。此外,当我为特定房间预订时,我将他们的预订列设置为1。这意味着,在现实生活中,当结账日期到来时,触发函数将该预订列设置成0。 如果酒店的所有房间都已预订(预订=1),并且这些房间的签入-退房日期是特定日期(签入-退房输入),则不要将该酒店放在列表中。我的查询不会显示我想要的结果。 查询:输入:国家(状态)、签入和签出。 当我运行查询时,它总是显

  • 我有一个大约为100GB的cosmos数据库。我成功地创建了一个漂亮的分区键,我在70M记录上有大约4600个分区,但是我仍然需要查询两个存储为字符串的日期时间字段,而不是纪元格式。 示例json: 我注意到当我做中选择*以及当我做

  • 我使用这个分析器创建了一个模型: 我实现了如下所示的查询。我得到了所有预期的结果,除了像“A.B.C”这样的结果。我做错了什么?我哪里误解了事情? 我的代码基于以下资源:

  • 我的文档中有一个日期范围(使用日期对象)如下所示 我试图弄清楚如何构建一个查询来返回包含特定日期的所有事件,例如,像.... 如果查询显示类似这样的内容,但在Firestore查询限制下可能不可能出现这种情况。 因此,我一直在挠头几个小时,要么为此构建一个查询,要么以某种方式结构我的数据,以允许这样做。 这有可能吗?