Solrでtint/tdateを使って範囲指定検索してみる

だいぶ前に Solrの範囲検索は結構重い(まぁ、そりゃそうか。。) なんていうエントリを書きましたが、 お金的なアレがxx以上とか、日付的なアレががxxより後だとか、その辺もやりくり出来るとイイのかと。 トライ木というソレ系のアレではよく見かけるTrie数値フィールド型というtintとtdateを使って計測してみます。   スキーマ定義   以下のように - int, pint, sint, tint と - date, pdate, tdate といった形で定義をします。(sdateは存在しない) それぞれのフィールドに同じようにデータを突っ込んで、 サーチ結果をトレースしようと思います。  

 <fields>
   <field name="id" type="string" indexed="true" stored="true" required="true" />
   <field name="name" type="text_ja" indexed="true" stored="true"/>
   <field name="searchInt"  type="int"  indexed="true" stored="true"/>
   <field name="searchIntP" type="pint" indexed="true" stored="true"/>
   <field name="searchIntS" type="sint" indexed="true" stored="true"/>
   <field name="searchIntT" type="tint" indexed="true" stored="true"/>
   <field name="searchDate"  type="date"  indexed="true" stored="true"/>
   <field name="searchDateP" type="pdate" indexed="true" stored="true"/>
   <field name="searchDateT" type="tdate" indexed="true" stored="true"/>
 </fields>

    ■ インデクシングプログラム   上記のスキーマ定義に対して適当にデータをバンバン突っ込む ちょっとしたプログラムを書いてみました↓ https://github.com/shinodogg/TrySolrj/blob/master/src/main/java/com/shinodogg/trysolrj/App.java   ↓こんな感じで100万レコードのデータが入っています。    また、本題とはあんまり関係ないですが、デバッグする時に 都度データを消してーとかってのをブラウザからやる時のメモ

http://localhost:8080/solr/update?stream.body=%3Cdelete%3E%3Cquery%3E*:*%3C/query%3E%3C/delete%3E&commit=true

    ■ 計測前準備   キャッシュが効いちゃうとアレなので諸々0にしてみます。

    <filterCache class="solr.FastLRUCache"
                 size="0"
                 initialSize="0"
                 autowarmCount="0"/>

    <queryResultCache class="solr.LRUCache"
                     size="0"
                     initialSize="0"
                     autowarmCount="0"/>

    <documentCache class="solr.LRUCache"
                   size="0"
                   initialSize="0"
                   autowarmCount="0"/>

  とりあえず100万レコードに対して前後方一致させてみます。 nameは↓のような感じになっていますが、

ランダムな数字 + 書籍名 + ランダムな数字

↓のように返ってきます。SSDのラップトップなのですが400ミリ秒とかで返ってくるんですね。。

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">383</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">*書籍*</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="999999" start="0">
<doc>

    ■ 計測   いよいよintとdateで範囲指定検索をしてみます...。   ★ int   ・int

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">533</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">searchInt:[* TO 8888888]</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="999999" start="0">

  ・pint

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">448</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">searchIntP:[* TO 8888888]</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="975302" start="0">

  ・sint

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">337</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">searchIntS:[* TO 8888888]</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="999999" start="0">

  ・tint

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">28</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">searchIntT:[* TO 8888888]</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="999999" start="0">

  tintハエェ…   ★ date   ・date

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">31</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">searchDate:[* TO 2006-04-07T00:00:00Z]</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="524745" start="0">

  ・pdate

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">33</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">searchDateP:[* TO 2006-04-07T00:00:00Z]</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="524745" start="0">

  ・tdate

<response>
<lst name="responseHeader">
<int name="status">0</int>
<int name="QTime">9</int>
<lst name="params">
<str name="indent">on</str>
<str name="start">0</str>
<str name="q">searchDateT:[* TO 2006-04-07T00:00:00Z]</str>
<str name="version">2.2</str>
<str name="rows">10</str>
</lst>
</lst>
<result name="response" numFound="524745" start="0">

  こっちもtdateが早い。

 

ということで、tほげほげにするとナイスっぽい手応えを得ました。 後は久しぶりにJMeterとか使ってバンバンクエリ投げた時にどう跳ねるかみてみないとだなぁ。  

Apache Solr入門 ―オープンソース全文検索エンジン
関口 宏司 三部 靖夫 武田 光平 中野 猛 大谷 純
技術評論社
売り上げランキング: 120086