2017.12.15 Friday
スポンサーサイト
一定期間更新がないため広告を表示しています
| スポンサードリンク | - | | - | - |
関口宏司のLuceneブログOSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
2011.12.20 Tuesday
KeywordAttribute について
近くの人に質問されたのでそれをネタに簡単に解説。
KeywordAttributeはトークンが「キーワードである」ということを下流のフィルターチェインに伝達するために使われる。 上流のTokenFilterなりTokenizerが任意のトークンのKeywordAttributeのsetKeyword(true)を呼んで「キーワードである」ことの印をつけ、下流のTokenFilterが処理しようとするトークンが「キーワードかどうか」を判断して自分の処理をすべきかどうかをisKeyword()を呼んで決める。 大抵は、lucene-gosenなどのJapaneseKatakanaStemFilterなどのstemmerでisKeyword()が呼ばれ、キーワードでない場合にステミング処理をしよう、という具合に使われる。 たとえば英語のstemmerはある条件下で末尾の"s"を削除するが、これを今は亡きsolrjs(SolrのJavaScriptクライアントAPI)に適用すると、末尾の"s"がとれてsolrjとなってしまい、これは今も健在のSolrのJavaクライアントAPIというまったく別物に変換されてしまう。これではまずいので、「solrjsはキーワードである」と印をつけておけば(setKeyword(true))、これは英語のstemmerで処理されなくなる。 Solrでは、schema.xmlにてKeywordMarkerFilterFactoryを使ってprotectedに「キーワード一覧」を記したファイル名を指定することができる。 なお、通常solrjsはキーワードであると印がつけられていたりするわけではないので、(Luceneが使われている)Apacheのバグチケット管理システムJIRAなどでsolrjsを検索すると、意図しないステミング処理がされてsolrjが多数ヒットしてしまう。これを避けるには、末尾に"*"をつけて"solrjs*"とする。するとLuceneのクエリパーサーの仕様により、ワイルドカード記号がつけられた文字列はAnalyzerをスキップするので、うまく"solrjs"を検索できる。 早くもSolr 3.5に対応したロンウイットのSolrトレーニング・・・Solr 3.5 1月 トレーニング受講者募集中 2011.12.12 Monday
IndexSearcher.close() の削除(4.0)
Lucene 4.0 でNo-op(空実装)であったIndexSearcherクラスのclose()メソッドが削除された。
https://issues.apache.org/jira/browse/LUCENE-3640 Lucene 3.5の時点で、IndexSearcherは自らIndexReaderインスタンスを作成して検索する方法がdeprecatedとなっており、プログラマが別途作成したIndexReaderをIndexSearcherのコンストラクタに渡す方法が推奨されていた。同時にこのときの修正でtrunk(4.0)のIndexSearcherから、IndexReaderを引数に取らないコンストラクタが完全に削除された。 https://issues.apache.org/jira/browse/LUCENE-3571 今回はこれをさらに推し進めた形となった。 早くもSolr 3.5に対応したロンウイットのSolrトレーニング・・・Solr 3.5 1月 トレーニング受講者募集中 2011.12.04 Sunday
FieldValueFilter (3.6)
とにかくそのフィールドに値が入っていたら(インデックスされていたら)OK、というFilterクラス、FieldValueFilterがLucene 3.6/4.0に追加された:
https://issues.apache.org/jira/browse/LUCENE-3593 使い方は、FieldValueFilterのコンストラクタに調べたい対象フィールド名を渡してFilterオブジェクトを作成し、IndexSearcherのsearch()メソッドに渡せばよい。 プログラム例 public final class TestFieldValueFilter { static final String INDEX = "index"; static final String F_ID = "id"; static final String F_VALUE = "value"; static Analyzer analyzer = new WhitespaceAnalyzer(Version.LUCENE_36); static Directory dir; public static void main(String[] args) throws Exception { dir = FSDirectory.open(new File(INDEX)); makeIndex(); searchIndex(false); searchIndex(true); } static void makeIndex() throws IOException { IndexWriterConfig config = new IndexWriterConfig(Version.LUCENE_36, analyzer); IndexWriter writer = new IndexWriter(dir, config); writer.addDocument(doc("one", "value 1")); writer.addDocument(doc("zero")); writer.addDocument(doc("two", "value 1", "value 2")); writer.close(); } static Document doc(String id, String... values){ Document doc = new Document(); doc.add(new Field(F_ID, id, Store.YES, Index.ANALYZED)); if(values != null){ for(String value : values){ doc.add(new Field(F_VALUE, value, Store.YES, Index.ANALYZED)); } } return doc; } static void searchIndex(boolean negate) throws IOException { System.out.println("¥n=== negate=" + negate); IndexReader reader = IndexReader.open(dir); IndexSearcher searcher = new IndexSearcher(reader); Filter filter = new FieldValueFilter(F_VALUE, negate); TopDocs docs = searcher.search(new MatchAllDocsQuery(), filter, 10); for(ScoreDoc scoreDoc : docs.scoreDocs){ Document doc = searcher.doc(scoreDoc.doc); System.out.printf("¥tid=%s¥n", doc.get(F_ID)); } searcher.close(); reader.close(); } } 実行結果 === negate=false id=one id=two === negate=true id=zero FieldValueFilterのコンストラクタにはboolean型の2つめの引数negateを取るものがあり、上記プログラムではそれを用いている。negateがfalseの場合は値がひとつでもあるものをフィルターを通過させるが、negate=trueの場合は逆の意味となる。 早くもSolr 3.5に対応したロンウイットのSolrトレーニング・・・Solr 3.5 1月 トレーニング受講者募集中 Solr トレーニングコースパンフレットダウンロードはこちら |
+ Solrによるブログ内検索
+ PROFILE
+ LINKS
+ Lucene&Solrデモ
+ ThinkIT記事
+ RECOMMEND
+ RECOMMEND
Lucene in Action (JUGEMレビュー »)
Erik Hatcher,Otis Gospodnetic,Mike McCandless FastVectorHighlighterについて解説記事を寄稿しました。
+ RECOMMEND
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ MOBILE
+ SPONSORED LINKS
|
(C) 2024 ブログ JUGEM Some Rights Reserved.
|
PAGE TOP |