Symfoware

Symfowareについての考察blog

lucene-gosenで、検索結果から除外するTokenを指定する(solr.JapanesePartOfSpeechStopFilterFactory)

lucene-gosenのドキュメントを読んでいると、検索結果から除外したい
Tokenを指定できることを知りました。
http://www.slideshare.net/JunOhtani/lucene-gosen-solr7

確かに、記号や感嘆符はインデックスから除外したいかもしれません。



schema.xml



除外するTokenを指定する設定ファイルが必要です。
サンプルはリポジトリに登録されています。
http://code.google.com/p/lucene-gosen/source/browse/trunk/src/resources/org/apache/lucene/analysis/ja/stoptags_ja.txt

また、このファイルはlucene-gosen-xxx.jarに含まれていますので、今回はjar内のstoptags_ja.txtを
指定することにしました。

別途、除外ルールを指定したい場合は設定ファイルを作成し、
solr/homeのconfディレクトリ(例えば、/usr/local/solr/conf/)に配置して
ファイル名を指定するようです。


作成したschema.xmlはこのようになりました。

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <schema name="example" version="1.4">
  3. <types>
  4.     <!-- The StrField type is not analyzed, but indexed/stored verbatim. -->
  5.     <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
  6.     <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
  7.     <fieldType name="text_ja" class="solr.TextField" positionIncrementGap="100">
  8.         <analyzer>
  9.             <tokenizer class="solr.JapaneseTokenizerFactory" />
  10.             <filter class="solr.JapanesePartOfSpeechStopFilterFactory" tags="org/apache/lucene/analysis/ja/stoptags_ja.txt" enablePositionIncrements="true" />
  11.         </analyzer>
  12.     </fieldType>
  13. </types>
  14. <fields>
  15. <field name="id" type="string" indexed="true" stored="true" required="true" />
  16. <field name="title" type="text_ja" indexed="true" stored="true" />
  17. <field name="body" type="text_ja" indexed="true" stored="true" />
  18. </fields>
  19. <uniqueKey>id</uniqueKey>
  20. <defaultSearchField>body</defaultSearchField>
  21. <solrQueryParser defaultOperator="AND"/>
  22. </schema>




最初、filterをどのように指定すればよいかわからなかったのですが、
analyzerタグの中にfilterを指定するようです。






テスト



このblogの内容を登録して、以下のプログラムで検索してみました。


  1. # -*- coding:utf-8 -*-
  2. import solr
  3. s = solr.SolrConnection('http://192.168.1.4:8080/solr')
  4. # 検索
  5. response = s.query(u'body:「')
  6. for hit in response.results:
  7.     print hit['id'], hit['title']




filterを指定していないschema.xmlを使用した場合は検索結果が表示されましたが、
filterを指定している場合は検索結果0件でした。


しばらく勘違いしていたのですが、filterは登録時ではなく、検索時に有効になるようです。
そのため、filterを指定していない状態でデータ登録していても、filterを
有効にして検索すれば検索結果は0件になります。


関連記事

テーマ:データベース - ジャンル:コンピュータ

  1. 2012/01/19(木) 23:49:05|
  2. apache solr
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
次のページ