特定の日付以降のイベントを検索するために Solandra を使用しています。これを行うには、エポック以降のミリ秒にインデックスを付け (slong データ型として)、次のように範囲検索を使用します: start:[1348992000000 TO *]
多くの場合、これは問題なく動作しますが、日付 X 以降は何も返されず、日付 Y (X < Y < 日付) 以降は返されるという奇妙なバグのある動作が発生することがあります。
たくさん遊んだ後、一貫して再現できるものを思いつくことができました(少なくとも私の側では)。再作成する手順は次のとおりです。
1)次のスキーマを作成します(xmlファイル全体が必要な場合はお知らせください。投稿します):
<fields>
<field name="id" type="string" indexed="true" stored="true" required="true" />
<field name="title" type="text" indexed="true" stored="false"/>
<field name="start" type="slong" indexed="true" stored="false"/>
</fields>
2) SolrJ を使用して次の Java プログラムを実行します。
public class IndexTest {
private static final SolrServer eventsServer = new HttpSolrServer("http://localhost:8983/solandra/events");
public static void main(String... args)
throws Exception {
save2(1350028800000L);
save2(1349424000000L);
save2(1348992000000L);
save2(1350028800000L);
save2(1350115200000L);
save2(1350374400000L);
save2(1348992000000L);
save2(1349424960000L);
save2(1349424000000L);
save1(1348992000000L);
save1(1348999200000L);
save1(1349431200000L);
save2(1349164800000L);
save2(1348992000000L);
save2(1349424000000L);
save1(1349444640000L);
save2(1350633600000L);
}
private static void save1(long time)
throws Exception {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "2ce011f0-0a80-11e2-bf94-b8f6b111caaf");
doc.addField("title", "Test");
doc.addField("start", time);
eventsServer.add(doc);
eventsServer.commit();
}
private static void save2(long time)
throws Exception {
SolrInputDocument doc = new SolrInputDocument();
doc.addField("id", "5d9e18f0-0a80-11e2-bf94-b8f6b111caaf");
doc.addField("title", "Test");
doc.addField("start", time);
eventsServer.add(doc);
eventsServer.commit();
}
}
3) 次のクエリを実行して、結果が返されていないことを確認します。
q=start:[1348992000000 TO *]
http://localhost:8983/solandra/events/select/?q=start:%5B1348992000000+TO+*%5D
4) 次のクエリを実行して、結果が返されることを確認します。
q=start:[1349049600177 TO *]
http://localhost:8983/solandra/events/select/?q=start:%5B1349049600177+TO+*%5D
注意事項:
commit() を削除すると、この特定の例が修正されるように見えますが、他のときにコミットが省略されたときにそれを目撃しました。Jake Luciani が書いたコメントから私が理解している限りでは、commit() は効果がないはずなので、この変更が一貫して結果に影響を与える理由について困惑しています。
複数のイベントをインデックスに登録している場合にのみ発生するようです (ただし、問題が最もランダムなタイミングで発生するように見えるため、確実ではありません)。
データ型 date を使用しないのはなぜですか? 私はもともとそうしましたが、特定のデータ型がこの問題を引き起こしていると思ったので切り替えました。日付、長い、長い、文字列、テキストのデータ型を試しました。すべてが同じ散発的な結果の欠落動作を示します。また、別のデータ型に切り替えると特定の例が修正される場合がありますが、他の例では明らかになることに注意してください。
最新の Cassandra ディストリビューションに埋め込むだけでなく、すぐに使える Solandra として github から直接 Solandra コードを試してみました。
これは私を夢中にさせているので、どんな助けや提案も大歓迎です!