FlexLuceneで日付フィルタリングを実現する方法

 ポイントは、以下の2点です。

  • ドキュメントの日付を、同一フィールド名でLongPointとStoredFieldを使って登録する。(17行目付近)
  • 検索時にLongPoint.NewRangeQueryを使って、絞込みを行う点です。(32行目)

実装例

  1. public void LongPointTest() {
  2. var analyzer = new WhitespaceAnalyzer();
  3. var iwc = new IndexWriterConfig(analyzer);
  4.  
  5. iwc.SetOpenMode(IndexWriterConfigOpenMode.CREATE);
  6.  
  7. //テスト用インデックス作成---------------------------------------------
  8. DateTime baseDate = DateTime.Parse("2020/07/16 08:00:00");
  9. var ram = new RAMDirectory();
  10. var writer = new IndexWriter(ram, iwc);
  11. try {
  12. for (int i = 0; i < 10; i++) {
  13. var doc = new Document();
  14. doc.Add(new TextField("text", "hoge foo", FieldStore.YES));
  15. DateTime tmp = baseDate.AddDays(i);
  16. long l = long.Parse(tmp.ToString("yyyyMMddHHmmss"));
  17. //日付文字列をlong値で保持
  18. doc.Add(new LongPoint("date", l));
  19. //long値をストアするには、同じフィールド名でStoredFieldとして指定する必要がある。
  20. doc.Add(new StoredField("date", l));
  21.  
  22. writer.AddDocument(doc);
  23. }
  24. } finally {
  25. writer.Close();
  26. }
  27.  
  28. //検索------------------------------------------------------------
  29. TermQuery tq = new TermQuery(new Term("text", "foo"));
  30. //日付範囲の条件
  31. Query rq = LongPoint.NewRangeQuery("date", 20200717000000, 20200719000000);
  32.  
  33. BooleanQueryBuilder b = new BooleanQueryBuilder();
  34. b.Add(tq, BooleanClauseOccur.MUST); //AND条件
  35. b.Add(rq, BooleanClauseOccur.FILTER); //AND条件(スコアリングに関与しない)
  36. Query q = b.Build();
  37.  
  38. DirectoryReader dr = DirectoryReader.Open(ram);
  39. IndexSearcher searcher = new IndexSearcher(dr);
  40. ScoreDoc[] hits = searcher.Search(q, 100).ScoreDocs;
  41. for (int i = 0; i < hits.Length; i++) {
  42. var doc = searcher.Doc(hits[i].Doc);
  43. Debug.WriteLine(DateTime.ParseExact(doc.Get("date"), "yyyyMMddHHmmss", null));
  44. }
  45. }

検索結果

2020/07/17 8:00:00
2020/07/18 8:00:00

0 件のコメント:

コメントを投稿

厳選 Visual Studioの便利なショートカット

  エラー箇所にジャンプ 「Ctrl + Shift + F12」 ブレークポイント 設定/解除 「F9」 有効化/無効化 「Ctrl + F9」 ViEmu特有 「:ls」:バッファナンバーのリストを表示。 「:b2」:バッファ2のファイルを開く。 「:n」:次のバッファのファ...