3

そのため、Railsプロジェクトでsunspotを使用しており、曲名のインデックスを作成しています。私がやりたいのは、特定の用語(たとえば、「自分を失う」)を検索して、結果リストの上部に、クエリに完全に一致するレコード(スペースとすべてを含む)を表示することです。

fieldTypeそのために、このようにschema.xml使用して新しいものを定義することにしKeywordTokenizerFactoryました(通常のテキストフィールドと一緒に使用することを計画していましたStandardTokenizer。これらの両方を使用して、KeywordTokenizedフィールドを使用して得られた結果を向上させます)。

<fieldType name="text_exact" class="solr.TextField" omitNorms="false">
  <analyzer>
    <tokenizer class="solr.KeywordTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.TrimFilterFactory"/>
  </analyzer>
</fieldType>

そして、このような動的フィールドを追加します(この目的のために複数値にする必要があるかどうかはわかりませんが、誰かがこれについて私に教えてくれるかもしれません):

<dynamicField name="*_exact" stored="false" type="text_exact" multiValued="true" indexed="true"/>

今、私のsong.rbファイルでは、searchable構成にこれがあります:

text :song_name do
  self.name
end

text :song_name_exact, as: :song_name_exact do
  self.name
end

問題は、song_name_exactフィールドを使用して検索しようとすると、クエリにスペースが含まれていると結果が得られないことです(したがって、という曲があり、それfooを検索すると検索されますが、ある曲を呼び出して検索すると、検索クエリは結果を返しません。foofoo barfoo bar

それで、まず最初に、これに対する私のアプローチが正しいかどうか、そしてなぜキーワードトークナイザーを使用したフィールドの検索が正しく機能しないのかを尋ねます。

4

1 に答える 1

1

「lose yourself」のみを検索しても結果が得られない理由は、KeywordTokenizerFactoryによって生成されたトークンは「lose youself」ですが、sunspot で使用される queryParse はクエリを「lose」と「yourself」の 2 つのトークンに分割するためです。

解決

そのため、 "\"lose yourself\""のように検索に二重引用符を追加して、フレーズ全体を検索する必要があります。

于 2013-03-21T22:33:28.983 に答える