ポイントは、以下の2点です。
- ドキュメントの日付を、同一フィールド名でLongPointとStoredFieldを使って登録する。(17行目付近)
- 検索時にLongPoint.NewRangeQueryを使って、絞込みを行う点です。(32行目)
実装例
- public void LongPointTest() {
- var analyzer = new WhitespaceAnalyzer();
- var iwc = new IndexWriterConfig(analyzer);
- iwc.SetOpenMode(IndexWriterConfigOpenMode.CREATE);
- //テスト用インデックス作成---------------------------------------------
- DateTime baseDate = DateTime.Parse("2020/07/16 08:00:00");
- var ram = new RAMDirectory();
- var writer = new IndexWriter(ram, iwc);
- try {
- for (int i = 0; i < 10; i++) {
- var doc = new Document();
- doc.Add(new TextField("text", "hoge foo", FieldStore.YES));
- DateTime tmp = baseDate.AddDays(i);
- long l = long.Parse(tmp.ToString("yyyyMMddHHmmss"));
- //日付文字列をlong値で保持
- doc.Add(new LongPoint("date", l));
- //long値をストアするには、同じフィールド名でStoredFieldとして指定する必要がある。
- doc.Add(new StoredField("date", l));
- writer.AddDocument(doc);
- }
- } finally {
- writer.Close();
- }
- //検索------------------------------------------------------------
- TermQuery tq = new TermQuery(new Term("text", "foo"));
- //日付範囲の条件
- Query rq = LongPoint.NewRangeQuery("date", 20200717000000, 20200719000000);
- BooleanQueryBuilder b = new BooleanQueryBuilder();
- b.Add(tq, BooleanClauseOccur.MUST); //AND条件
- b.Add(rq, BooleanClauseOccur.FILTER); //AND条件(スコアリングに関与しない)
- Query q = b.Build();
- DirectoryReader dr = DirectoryReader.Open(ram);
- IndexSearcher searcher = new IndexSearcher(dr);
- ScoreDoc[] hits = searcher.Search(q, 100).ScoreDocs;
- for (int i = 0; i < hits.Length; i++) {
- var doc = searcher.Doc(hits[i].Doc);
- Debug.WriteLine(DateTime.ParseExact(doc.Get("date"), "yyyyMMddHHmmss", null));
- }
- }
検索結果
2020/07/17 8:00:00
2020/07/18 8:00:00
0 件のコメント:
コメントを投稿