web-dev-qa-db-ja.com

solrシノニムを機能させる方法

Solrでいくつかの基本的な同義語を設定しようとしています。私が取り組んできたのは:

私たち、アメリカ、アメリカ

私の理解では、これを同義語ファイルに追加すると、ユーザーは米国を検索し、米国または米国を含むドキュメントを取得できるようになります。ユーザーが米国または米国に置く場合も同様です。

残念ながら、これを設定すると、検索を実行すると、3つの単語すべてを含むアイテムの結果が得られます。ORではなく同義語のANDを実行しています。

デバッグをオンにすると、これは確かに私が見るものです(さらにいくつかのステミング):

(+DisjunctionMaxQuery(((westCite:us westCite:usa westCite:unit) | (text:us text:usa text:unit) | (docketNumber:us docketNumber:usa docketNumber:unit) | ((status:us status:usa status:unit)^1.25) | (court:us court:usa court:unit) | (lexisCite:us lexisCite:usa lexisCite:unit) | ((caseNumber:us caseNumber:usa caseNumber:unit)^1.25) | ((caseName:us caseName:usa caseName:unit)^1.5))))/no_coord

私はこれを引き起こすために何か間違ったことをしていますか? defaultOperatorはANDに設定されていますが、シノニムフィルターがそれを理解することを期待しています。

11
mlissner

SynonymFilterFactoryは、クエリ中ではなく、インデックス作成中にのみ使用してみてください。

ドキュメントはこれも示唆しています: http://wiki.Apache.org/solr/AnalyzersTokenizersTokenFilters#solr.SynonymFilterFactory

21
rfeak

同義語検索をよりよく理解するために、以下の実装のステップバイステップのプロセスに従ってください(私はsolr 6.5。*バージョンを使用しています):

ステップ1:

country-synonyms.txt テキストファイルをダウンロードして、以下のパスに配置します。

パス:\ solr-6.5.1\server\solr\yourCore\conf

yourCore:コアの名前はそれに応じて変更する必要があります

ステップ2:

上記と同じパスのmanaged-schemaファイルにフィールドタイプを追加します。

<fieldType name="country" class="solr.TextField" positionIncrementGap="100" sortMissingLast="true">
<analyzer>
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.TrimFilterFactory"/>
  <filter class="solr.SynonymFilterFactory" expand="false" ignoreCase="true" synonyms="country-synonyms.txt" tokenizerFactory="solr.KeywordTokenizerFactory"/>
  <filter class="solr.LowerCaseFilterFactory"/>
</analyzer></fieldType>

ステップ3:同じタイプcountryのフィールド(国籍)を追加しますファイル(管理スキーマ)。

<field name="Nationality" type="country" indexed="true" stored="true"/>

ステップ4:solrを再起動します。

solr restart -p <your solr port>

ステップ5:

次に、Nationality。***を含むフィールドを使用してデータをインポートします。

ステップ6:

次に、以下のケースでクエリを実行してテストします。

クエリ

  1. 国籍:米国
  2. 国籍:米国
  3. 国籍:アメリカ合衆国
  4. 国籍:アメリカ合衆国

上記のクエリはすべて同じ結果になります。

:*** solrの再起動を含む上記の手順を実行した後にのみ、データをインポートします。既存のデータでは機能しない可能性があります(詳細については、 AnalyzersTokenizersTokenFilters を参照してください)

5
shivadarshan

新しいSolrの観点から答えを完成させるために、同義語に関して1つ追加したいと思います。 Solrの最近のバージョンは、クエリおよびインデックス作成時にマルチワードシノニムを適切に処理します。

新しい同義語の実装を使用するには、次のような別のフィルターを使用する必要があります。

<filter class="solr.SynonymGraphFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>

また、indexの時間中にそれらを使用している場合は、分析チェーン定義の最後に次のフィルターを配置します。

<filter class="solr.FlattenGraphFilterFactory"/>

うまくいけば、誰かがそれが役に立つと思うでしょう:)

0
Rafal