類義語検索と類義語ハイライト 
2014/12 
shinichiro@apache.org 
1
About me 
• 株式会社ロンウイット 
• Apache Solr & Apache ManifoldCF トレーニング&コンサルティング 
&サポート 
• [改訂新版] Apache Solr入門第6章「データのクローリング」担当 
• Apache ManifoldCF committer & PMC member 
• 第6回と第8回のSolr勉強会で発表 
– http://www.slideshare.net/ShinichiroAbe/apache-manifoldcf 
– http://www.slideshare.net/ShinichiroAbe/solr-40-13545722 
2
アジェンダ 
• 日本語全文検索の検索設定・ハイライト設定例 
• 類義語の検索とハイライト 
– 類義語 
• 類義語,同義語,類語,同意語,シノニム,類似語 
• 記事:類義語検索と類義語ハイライト 
– http://www.rondhuit.com/synonym-searching-and-synonym-highlighting. 
html 
3
日本語全文検索の検索設定例 
• 1)検索漏れの対応 
– edismaxによる形態素解析フィールドとN-gramフィールドの横断検索 
q=単語&defType=edismax&qf=title_ja^4 content_ja^3 title_2g^2 content_2g 
• 例: 
– 形態素解析フィールドにインデクシング「製造部門長谷川」 
• 製造|部門|長谷川 
– 形態素解析だけだと、q=門長やq=谷川でヒットできなくなってしまう 
– なので、2-gramフィールドで漏れをカバーする 
• 製造|造部|部門|門長|長谷|谷川 
4
日本語全文検索の検索設定例 
• 2)検索ゴミの対応 
– qfパラメータでN-gramフィールドの重みを下げる 
– システム出力(ゴミ)を減らす 
• autoGeneratePhraseQueries(デフォルトfalse->true) 
• 例: 
– q=こんにちは(2-gramでパース) 
• AGFQ=false-> (こんんににちちは) --BooleanQuery 
– q.op=ORなら「こんばんは」、「にちようび」もヒットしてしまう 
• AGFQ=true -> PhraseQuery("こんんににちちは") 
– q=会社(1-gramでパース) 
• AGFQ=false-> (会社) 
– q.op=ORなら「会場」、「弊社」もヒットしてしまう 
– q.op=ANDなら「社会」もヒットしてしまう 
• AGFQ=true -> PhraseQuery("会社") 
– AGFQ=falseは自動でフレーズクエリにしない->ポジションは考慮しない 
5 
<fieldType name="text_2g" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
日本語全文検索のハイライト設定例 
• ハイライタ 
– storedフィールドをフラグメントに分割し、クエリにマッチしたフラグメントをス 
コアリング、高いものをハイライトスニペット候補にして、開始・終了オフセッ 
トを使って、マッチした単語に強調タグをつけて返す 
• ハイライト対象フィールド(hl.fl)は、検索漏れを考慮して、N-gram 
フィールドを指定 
– N-gramでstoredフィールドをアナライズしてハイライト 
• 3つのハイライタ 
– Standard Highlighter(デフォルト) 
– FastVector Highlighter(aka FVH) 
– Postings Highlighter 
6
日本語全文検索のハイライト設定例 
• デフォルトハイライタ 
– N-gramフィールドのハイライトがうまくいかない(LUCENE-1489) 
– 例: 
• 2-gramフィールドにインデクシング:「Aを指定し、Bを指定し、Cを指定する」 
– q=指定&hl=on&hl.fl=content_2g 
» Aを<em>指定し、Bを指定し、Cを指定</em>する 
• FVH 
– デフォルトより速い。ただしインデックスサイズが大きくなる。 
• インデクシング時に保存したtermVectorsを使ってハイライトするのでstored 
フィールドの再アナライズをしない分速い 
– N-gramフィールドのサポート&フレーズ単位にハイライティング 
– 例: 
– q=指定&hl=on&hl.fl=content_2g&hl.useFastVectorHighlighter=true 
» Aを<b>指定</b>し、Bを<b>指定</b>し、Cを<b>指定</b>する 
– q=こんにちは&hl=on&hl.fl=content_2g&hl.useFastVectorHighlighter=true 
» <b>こんにちは</b> こんばんは 
7
日本語全文検索のハイライト設定例 
• PostingsSolrHighlighter 
– FVHより速い。インデックスサイズも小さくできる 
• インデクシング時に保存したオフセットを使ってハイライト 
– ただしフレーズ単位のハイライティングの未サポート(LUCENE-4825) 
– 例: 
• q=こんにちは&hl=on&hl.fl=content_2g 
– <em>こん</em><em>に</em><em>ち</em><em>は</em> <em>こん</em>ばんは 
• q="apple juice"&hl=on&hl.fl=content_2g 
– <em>apple</em> <em>juice</em> <em>apple</em> 
• ハイライタの選択 
– 高速かつ(フレーズ単位の)正確なハイライトをするなら、FVH 
• インデックスサイズとインデクシング時間は犠牲にする 
8
検索とハイライトの設定まとめ、それから類義語対応 
• 検索とハイライトの前提条件 
– 形態素解析フィールドとN-gramフィールドの横断検索 
– autoGeneratePhraseQueries=true 
– &hl=on&hl.fl=content_2g&hl.useFastVectorHighlighter=true 
• 類義語対応-(2-gramの例) 
– フィールドタイプでSynonymFilterFactoryを追加する 
9 
<fieldType name="text_2g" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> 
<analyzer type="index"> 
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/> 
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" 
ignoreCase="true" expand="true" 
tokenizerFactory="solr.NGramTokenizerFactory" 
tokenizerFactory.minGramSize="2" 
tokenizerFactory.maxGramSize="2” 
luceneMatchVersion="3.3"/> 
</analyzer> 
<analyzer type="query"> 
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/> 
</analyzer> 
</fieldType>
SynonymFilterFactoryの設定 
• tokenizerFactory*属性 
– 上流トークナイザを指定してそのトークナイザでシノニム辞書内の類義語を読 
み込み、トークンをマッチさせる 
– 上流トークナイザが持つ属性を同じように設定する(SOLR-4813) 
• type="index"側で設定し、expand属性を=true 
– ■インデクシング側に設定し、シノニム辞書を等価形式にして展開する■ 
• シノニム辞書を変更したら再インデクシングする必要がある 
– クエリ側に設定すると、フレーズクエリのときMultiPhraseQueryが生成されて 
ヒットできなくなる(AGFQ=trueならフレーズクエリになりうるので) 
• 「[改訂新版] Apache Solr入門」第9章P.281-285 P.300-302を参照 
– クエリ側に設定したい場合、シノニム辞書が片方向形式だと、インデクシング側 
にも設定しないと、マッチしない 
– クエリ側に設定すると、類義語のIDFが効いて、レアな類義語が高いスコアを相 
対的に獲得してしまう(Television > TV) 
• https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory 
– コミュニティではクエリ側での利用の要望・パッチ提案がある(SOLR-4381, SOLR- 
5379など)が、取り込まれてはいない 
10
SynonymFilterFactoryの設定 
• synonyms="synonyms.txt" 
#片方向形式 
aaa => bbb 
aaa => ccc 
#これで、aaa=>bbb,cccになる 
#等価形式(双方向展開) 
内閣総理大臣,首相,安倍,野田 
• luceneMatchVersion 
– <= 3.3 SlowSynonymFilter 
• 従来のフィルタ 
– >= 3.4 FSTSynonymFilter(LUCENE-3233) 
• デフォルト。シノニム辞書ロードのメモリがコンパクトになり、処理が速 
い。ManagedSynonymFilterFactoryではこちらを採用 
• 従来と実装が変わったため、ポジションとオフセットの振り方が変わっ 
た。この影響で類義語検索でヒットできないケース・類義語ハイライトが 
ズレるケースがある11
FSTSynonymFilterの制限事項 
• マルチトークンな類義語はトークングラフ生成が複雑になり、フレーズクエリの検索 
がおかしくなる 
– http://s.apache.org/TokenGraphs 
– Automata Invasion P.23 
• http://www.slideshare.net/lucenerevolution/automaton-invasionlucenerevolution2012 
• その結果、 
– 類義語検索でヒットできなかったり意図しないヒットが起こる 
• ポジションの振り方が変わったためフレーズクエリの検索が失敗する/意図しないヒットを 
する場合がある 
– 類義語ハイライトがズレる 
• オフセットの振り方が変わったためハイライトがズレる 
– 従来のポジション&オフセットの振り方を維持できない 
• 回避方法->「シングルトークンで類義語を定義する」 
– 片方向形式+インデックス側とクエリ側にSynonymFilterFactoryを配置 
• 内閣総理大臣,首相=> 首相 
• エンジニア,技術者=> 技術(?) シングルトークン代表を探すのが無理 
• 徳川家康,竹千代=> 家康(?) シングルトークン代表を探すのが無理 
• dns, domain name service => dns 
• グラフ生成の別アプローチのパッチ提案がある(LUCENE-5012)が、取り込まれては 
いない 
12
[FST|Slow]SynonymFilterの問題点 
• 類義語検索でヒットできない例(FST|Slow両方): 
– シノニム辞書は「内閣総理大臣,首相」 
– 2-gramフィールドにインデクシング:「内閣総理大臣でございます」 
• q=首相で 
– ヒットしない。PQ("首相相で")で次ポジションに「相で」がない 
– 「臣で」は2-gramのとき生成される 
– 1-gramフィールドにインデクシング:「内閣総理大臣でございます」 
• q=首相で 
– ヒットしない。PQ("首相で")で次ポジションに「で」がない 
13 
トークン[ポジション] |首相[1] |臣で[6]|でご[7]|ござ|ざい| 
|内閣[1]|閣総[2]|総理[3]|理大[4]|大臣[5]| 
トークン[ポジション] |首[1]|相[2] |で[7]|ご[8]|ざ[8]|い[10] 
|内[1]|閣[2]|総[3]|理[4]|大[5]|臣[6]|
FSTSynonymFilterの問題点 
• 類義語検索でヒットしないのを期待するがヒットする例: 
– シノニム辞書は「dns, domain name service」 
– textフィールドにインデクシング:「dns is up」 
• q="dns name up" 
– フレーズクエリでヒットしてしまう 
– 従来のSlowSynの場合は上記フレーズクエリはヒットしない 
14 
トークン[ポジション] |dns[1] |is[2] |up[3] | 
|domain[1]|name[2]|service[3]| 
トークン[ポジション] |dns[1] |is[4] |up[5] | 
|domain[1]|name[2]|service[3]|
FSTSynonymFilterの問題点 
• 類義語ハイライトがズレる例: 
– シノニム辞書は「内閣総理大臣,首相」 
– 2-gramフィールドにインデクシング:「首相でございます」 
• q=内閣総理大臣&hl=on 
– <b>首相でござい</b>ます 
– ハイライトズレ。オフセット0-6でハイライトするため 
15 
トークン 
[開始オフセット, 
終了オフセット] 
|首相[0,2]|相で[1,3]|でご[2,4]|ござ[3,5]|ざい[4,6]|いま[5,7]|ます[6,8] 
|内閣[0,2]|閣総[1,3]|総理[2,4]|理大[3,5]|大臣[4,6]|
SlowSynonymFilter 
• 類義語ハイライトはズレない 
– 類義語が同一オフセットになるからズレない 
– q=首相&hl=on 
– q=内閣総理大臣&hl=on 
• ハイライトがズレないようにするには、FSTSynではなくSlowSynを使 
えばよい 
– SOLR-3390 
• luceneMatchVersion="3.3" 
16 
トークン 
[開始オフセット, 
終了オフセット] 
|首相[0,6] |臣で[5,7]|でご[6,8]| 
|内閣[0,6]|閣総[0,6]|総理[0,6]|理大[0,6]|大臣[0,6]|
branch_5x 
• LUCENE-5944branch_5x作成&@Deprecatedなクラスの削除など 
– https://svn.apache.org/viewvc?limit_changes=0&view=revision&revision=1626055 
• SlowSynonymFilterの削除、FSTSynonymFilter->SynonymFilter 
• (補足)CJKTokenizerの削除 
• (補足) schema.xmlにあるtext_cjk型でシノニムは使えない 
– 「[改訂新版] Apache Solr入門」P.284 参照 
– NGramTokenizerを使う 
17
NGramSynonymTokenizer 
• LUCENE-5252のパッチ 
– http://www.slideshare.net/KojiSekiguchi/lucene-5252n-gramsynonymtokenizer 
– シノニム辞書にある類義語のトークンはN-gram分割しない。類義語は同一ポジショ 
ン同一オフセットを保持する 
– 類義語の両脇の文字列を補正する 
• 類義語検索でヒットできる 
– シノニム辞書は「内閣総理大臣,首相」 
– 2-gramフィールドにインデクシング:「内閣総理大臣でございます」 
• q=首相で 
• 類義語ハイライトはズレない 
• q=首相で 
18 
トークン[ポジション] |首相[1]|で[2]|ござ[3]|ざい[4]|いま|ます 
|内閣総理大臣[1]|でご[2]| 
トークン 
[開始オフセット, 
終了オフセット] 
|首相[0,6]|で[6,7]|ござ[7,9]|ざい[8,10]|いま|ます 
|内閣総理大臣[0,6]|でご[6,6]|

類義語検索と類義語ハイライト

  • 1.
  • 2.
    About me •株式会社ロンウイット • Apache Solr & Apache ManifoldCF トレーニング&コンサルティング &サポート • [改訂新版] Apache Solr入門第6章「データのクローリング」担当 • Apache ManifoldCF committer & PMC member • 第6回と第8回のSolr勉強会で発表 – http://www.slideshare.net/ShinichiroAbe/apache-manifoldcf – http://www.slideshare.net/ShinichiroAbe/solr-40-13545722 2
  • 3.
    アジェンダ • 日本語全文検索の検索設定・ハイライト設定例 • 類義語の検索とハイライト – 類義語 • 類義語,同義語,類語,同意語,シノニム,類似語 • 記事:類義語検索と類義語ハイライト – http://www.rondhuit.com/synonym-searching-and-synonym-highlighting. html 3
  • 4.
    日本語全文検索の検索設定例 • 1)検索漏れの対応 – edismaxによる形態素解析フィールドとN-gramフィールドの横断検索 q=単語&defType=edismax&qf=title_ja^4 content_ja^3 title_2g^2 content_2g • 例: – 形態素解析フィールドにインデクシング「製造部門長谷川」 • 製造|部門|長谷川 – 形態素解析だけだと、q=門長やq=谷川でヒットできなくなってしまう – なので、2-gramフィールドで漏れをカバーする • 製造|造部|部門|門長|長谷|谷川 4
  • 5.
    日本語全文検索の検索設定例 • 2)検索ゴミの対応 – qfパラメータでN-gramフィールドの重みを下げる – システム出力(ゴミ)を減らす • autoGeneratePhraseQueries(デフォルトfalse->true) • 例: – q=こんにちは(2-gramでパース) • AGFQ=false-> (こんんににちちは) --BooleanQuery – q.op=ORなら「こんばんは」、「にちようび」もヒットしてしまう • AGFQ=true -> PhraseQuery("こんんににちちは") – q=会社(1-gramでパース) • AGFQ=false-> (会社) – q.op=ORなら「会場」、「弊社」もヒットしてしまう – q.op=ANDなら「社会」もヒットしてしまう • AGFQ=true -> PhraseQuery("会社") – AGFQ=falseは自動でフレーズクエリにしない->ポジションは考慮しない 5 <fieldType name="text_2g" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true">
  • 6.
    日本語全文検索のハイライト設定例 • ハイライタ – storedフィールドをフラグメントに分割し、クエリにマッチしたフラグメントをス コアリング、高いものをハイライトスニペット候補にして、開始・終了オフセッ トを使って、マッチした単語に強調タグをつけて返す • ハイライト対象フィールド(hl.fl)は、検索漏れを考慮して、N-gram フィールドを指定 – N-gramでstoredフィールドをアナライズしてハイライト • 3つのハイライタ – Standard Highlighter(デフォルト) – FastVector Highlighter(aka FVH) – Postings Highlighter 6
  • 7.
    日本語全文検索のハイライト設定例 • デフォルトハイライタ – N-gramフィールドのハイライトがうまくいかない(LUCENE-1489) – 例: • 2-gramフィールドにインデクシング:「Aを指定し、Bを指定し、Cを指定する」 – q=指定&hl=on&hl.fl=content_2g » Aを<em>指定し、Bを指定し、Cを指定</em>する • FVH – デフォルトより速い。ただしインデックスサイズが大きくなる。 • インデクシング時に保存したtermVectorsを使ってハイライトするのでstored フィールドの再アナライズをしない分速い – N-gramフィールドのサポート&フレーズ単位にハイライティング – 例: – q=指定&hl=on&hl.fl=content_2g&hl.useFastVectorHighlighter=true » Aを<b>指定</b>し、Bを<b>指定</b>し、Cを<b>指定</b>する – q=こんにちは&hl=on&hl.fl=content_2g&hl.useFastVectorHighlighter=true » <b>こんにちは</b> こんばんは 7
  • 8.
    日本語全文検索のハイライト設定例 • PostingsSolrHighlighter – FVHより速い。インデックスサイズも小さくできる • インデクシング時に保存したオフセットを使ってハイライト – ただしフレーズ単位のハイライティングの未サポート(LUCENE-4825) – 例: • q=こんにちは&hl=on&hl.fl=content_2g – <em>こん</em><em>に</em><em>ち</em><em>は</em> <em>こん</em>ばんは • q="apple juice"&hl=on&hl.fl=content_2g – <em>apple</em> <em>juice</em> <em>apple</em> • ハイライタの選択 – 高速かつ(フレーズ単位の)正確なハイライトをするなら、FVH • インデックスサイズとインデクシング時間は犠牲にする 8
  • 9.
    検索とハイライトの設定まとめ、それから類義語対応 • 検索とハイライトの前提条件 – 形態素解析フィールドとN-gramフィールドの横断検索 – autoGeneratePhraseQueries=true – &hl=on&hl.fl=content_2g&hl.useFastVectorHighlighter=true • 類義語対応-(2-gramの例) – フィールドタイプでSynonymFilterFactoryを追加する 9 <fieldType name="text_2g" class="solr.TextField" positionIncrementGap="100" autoGeneratePhraseQueries="true"> <analyzer type="index"> <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/> <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.NGramTokenizerFactory" tokenizerFactory.minGramSize="2" tokenizerFactory.maxGramSize="2” luceneMatchVersion="3.3"/> </analyzer> <analyzer type="query"> <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="2"/> </analyzer> </fieldType>
  • 10.
    SynonymFilterFactoryの設定 • tokenizerFactory*属性 – 上流トークナイザを指定してそのトークナイザでシノニム辞書内の類義語を読 み込み、トークンをマッチさせる – 上流トークナイザが持つ属性を同じように設定する(SOLR-4813) • type="index"側で設定し、expand属性を=true – ■インデクシング側に設定し、シノニム辞書を等価形式にして展開する■ • シノニム辞書を変更したら再インデクシングする必要がある – クエリ側に設定すると、フレーズクエリのときMultiPhraseQueryが生成されて ヒットできなくなる(AGFQ=trueならフレーズクエリになりうるので) • 「[改訂新版] Apache Solr入門」第9章P.281-285 P.300-302を参照 – クエリ側に設定したい場合、シノニム辞書が片方向形式だと、インデクシング側 にも設定しないと、マッチしない – クエリ側に設定すると、類義語のIDFが効いて、レアな類義語が高いスコアを相 対的に獲得してしまう(Television > TV) • https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory – コミュニティではクエリ側での利用の要望・パッチ提案がある(SOLR-4381, SOLR- 5379など)が、取り込まれてはいない 10
  • 11.
    SynonymFilterFactoryの設定 • synonyms="synonyms.txt" #片方向形式 aaa => bbb aaa => ccc #これで、aaa=>bbb,cccになる #等価形式(双方向展開) 内閣総理大臣,首相,安倍,野田 • luceneMatchVersion – <= 3.3 SlowSynonymFilter • 従来のフィルタ – >= 3.4 FSTSynonymFilter(LUCENE-3233) • デフォルト。シノニム辞書ロードのメモリがコンパクトになり、処理が速 い。ManagedSynonymFilterFactoryではこちらを採用 • 従来と実装が変わったため、ポジションとオフセットの振り方が変わっ た。この影響で類義語検索でヒットできないケース・類義語ハイライトが ズレるケースがある11
  • 12.
    FSTSynonymFilterの制限事項 • マルチトークンな類義語はトークングラフ生成が複雑になり、フレーズクエリの検索 がおかしくなる – http://s.apache.org/TokenGraphs – Automata Invasion P.23 • http://www.slideshare.net/lucenerevolution/automaton-invasionlucenerevolution2012 • その結果、 – 類義語検索でヒットできなかったり意図しないヒットが起こる • ポジションの振り方が変わったためフレーズクエリの検索が失敗する/意図しないヒットを する場合がある – 類義語ハイライトがズレる • オフセットの振り方が変わったためハイライトがズレる – 従来のポジション&オフセットの振り方を維持できない • 回避方法->「シングルトークンで類義語を定義する」 – 片方向形式+インデックス側とクエリ側にSynonymFilterFactoryを配置 • 内閣総理大臣,首相=> 首相 • エンジニア,技術者=> 技術(?) シングルトークン代表を探すのが無理 • 徳川家康,竹千代=> 家康(?) シングルトークン代表を探すのが無理 • dns, domain name service => dns • グラフ生成の別アプローチのパッチ提案がある(LUCENE-5012)が、取り込まれては いない 12
  • 13.
    [FST|Slow]SynonymFilterの問題点 • 類義語検索でヒットできない例(FST|Slow両方): – シノニム辞書は「内閣総理大臣,首相」 – 2-gramフィールドにインデクシング:「内閣総理大臣でございます」 • q=首相で – ヒットしない。PQ("首相相で")で次ポジションに「相で」がない – 「臣で」は2-gramのとき生成される – 1-gramフィールドにインデクシング:「内閣総理大臣でございます」 • q=首相で – ヒットしない。PQ("首相で")で次ポジションに「で」がない 13 トークン[ポジション] |首相[1] |臣で[6]|でご[7]|ござ|ざい| |内閣[1]|閣総[2]|総理[3]|理大[4]|大臣[5]| トークン[ポジション] |首[1]|相[2] |で[7]|ご[8]|ざ[8]|い[10] |内[1]|閣[2]|総[3]|理[4]|大[5]|臣[6]|
  • 14.
    FSTSynonymFilterの問題点 • 類義語検索でヒットしないのを期待するがヒットする例: – シノニム辞書は「dns, domain name service」 – textフィールドにインデクシング:「dns is up」 • q="dns name up" – フレーズクエリでヒットしてしまう – 従来のSlowSynの場合は上記フレーズクエリはヒットしない 14 トークン[ポジション] |dns[1] |is[2] |up[3] | |domain[1]|name[2]|service[3]| トークン[ポジション] |dns[1] |is[4] |up[5] | |domain[1]|name[2]|service[3]|
  • 15.
    FSTSynonymFilterの問題点 • 類義語ハイライトがズレる例: – シノニム辞書は「内閣総理大臣,首相」 – 2-gramフィールドにインデクシング:「首相でございます」 • q=内閣総理大臣&hl=on – <b>首相でござい</b>ます – ハイライトズレ。オフセット0-6でハイライトするため 15 トークン [開始オフセット, 終了オフセット] |首相[0,2]|相で[1,3]|でご[2,4]|ござ[3,5]|ざい[4,6]|いま[5,7]|ます[6,8] |内閣[0,2]|閣総[1,3]|総理[2,4]|理大[3,5]|大臣[4,6]|
  • 16.
    SlowSynonymFilter • 類義語ハイライトはズレない – 類義語が同一オフセットになるからズレない – q=首相&hl=on – q=内閣総理大臣&hl=on • ハイライトがズレないようにするには、FSTSynではなくSlowSynを使 えばよい – SOLR-3390 • luceneMatchVersion="3.3" 16 トークン [開始オフセット, 終了オフセット] |首相[0,6] |臣で[5,7]|でご[6,8]| |内閣[0,6]|閣総[0,6]|総理[0,6]|理大[0,6]|大臣[0,6]|
  • 17.
    branch_5x • LUCENE-5944branch_5x作成&@Deprecatedなクラスの削除など – https://svn.apache.org/viewvc?limit_changes=0&view=revision&revision=1626055 • SlowSynonymFilterの削除、FSTSynonymFilter->SynonymFilter • (補足)CJKTokenizerの削除 • (補足) schema.xmlにあるtext_cjk型でシノニムは使えない – 「[改訂新版] Apache Solr入門」P.284 参照 – NGramTokenizerを使う 17
  • 18.
    NGramSynonymTokenizer • LUCENE-5252のパッチ – http://www.slideshare.net/KojiSekiguchi/lucene-5252n-gramsynonymtokenizer – シノニム辞書にある類義語のトークンはN-gram分割しない。類義語は同一ポジショ ン同一オフセットを保持する – 類義語の両脇の文字列を補正する • 類義語検索でヒットできる – シノニム辞書は「内閣総理大臣,首相」 – 2-gramフィールドにインデクシング:「内閣総理大臣でございます」 • q=首相で • 類義語ハイライトはズレない • q=首相で 18 トークン[ポジション] |首相[1]|で[2]|ござ[3]|ざい[4]|いま|ます |内閣総理大臣[1]|でご[2]| トークン [開始オフセット, 終了オフセット] |首相[0,6]|で[6,7]|ござ[7,9]|ざい[8,10]|いま|ます |内閣総理大臣[0,6]|でご[6,6]|