Fess 8.2のリリース

リリースしました。ここからダウンロードできます。Solr 4.4に更新したり、細かい修正をいろいろとしたりな感じです。Fessもいつの間にやら、8になり、かなり成長してきています。ですが、次は 9 にして、クロールジョブ管理機能の一新とサジェストのリファクタリングという感じで、大玉を考えています。という感じで、次もお楽しみに〜。あとついでにFessの案件も増えていて、N2SMではFess関連の作業をするエンジニアも募集中です。こっちも興味があれば気軽にお問い合わせください。
P.S. Fessについての質問等は、Fessのメーリングリストまたはフォーラムをご利用ください。そこに上げていただければベストエフォートで対応します。直接の問い合わせもいただくこともあるのですが、商用サポート以外の直対応はできないと思います…。ごめんなさい。

Solrでドメイン名をインデックスする

Solrでドメイン名のようなものを対象にするとき、どんなAnalyzerの設定が良いか考えてみると、PathHierarchyTokenizerFactoryを使って以下のような感じが良いのかなっと。

<fieldType name="domain_name" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="." reverse="true"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory" />
    </analyzer>
</fieldType>

Fessではサンプルで定義されていたurlフィールド型をsiteに使っていたのだけど、どうもこれだといまいちな感じなので上記の設定に変更しようと思う。これにすると、www.codelibs.orgをインデックスると

www.codelibs.org
codelibs.org
org

が登録される。検索クエリの時はそのまま行くのでうまくマッチすればサブドメインとか含めてヒットするだろう。

FessでFunctionQueryの値を表示する

次のバージョンのFessでは(8.2以降)、SolrのFunctionQueryの値を表示できるようにしてみた。実行したいFunctionQueryとかは、app.diconのQueryHelperImplで指定する。

<component name="queryHelper"   class="jp.sf.fess.helper.impl.QueryHelperImpl">
...
<initMethod name="addQueryParam">
<arg>"word"</arg>
<arg>new String[]{"$query"}</arg>
</initMethod>
<property name="responseFields">new String[]{"id", "score", "boost",
"contentLength", "host", "site", "lastModified", "mimetype",
"tstamp", "title", "digest", "url", "clickCount_i", "favoriteCount_i",
"screenshot_s_s", "wordcount:wordfreq(content,$word)"}</property>
...

上記では、wordfreq(field,word)というFess独自のFunctionQueryをwordcountというフィールドとして扱えるようにしている。Solrの利用可能なFunctionQueryについては、ここに書いてある。wordfreqの第一引数はフィールド名だが、第二引数はリクエストパラメータのqueryから取得したいので、addQueryParamでwordcount:wordfreq(content,$word)の$wordをリクエストパラメータのqueryに置き換えを行う。つまり、addQueryParamのところで$queryとすれば、リクエストパラメータに置き換わる想定。
あとはsearchResults.jspとかで、${doc.wordcount}とすればFunctionQueryの値が表示される感じ。xmlやjsonのレスポンスにもwordcountとして値を取得可能です。