0

solrを使用して全文検索を実装しています。誰かが直面している問題について、誰かが私に助けを提供してくれれば幸いです。

私のschema.xmlは次のようになります。

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="products" version="1.2">
    <types>
        <fieldType name="long" class="solr.TrieLongField" precisionStep="0" omitNorms="true" positionIncrementGap="0"/>
            <fieldType name="concatenated" class="solr.TextField" positionIncrementGap="100" >
                <analyzer>
                <tokenizer class="solr.LowerCaseTokenizerFactory"/>
                <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="15" side="front"/>
                <filter class="solr.WordDelimiterFilterFactory"
                    splitOnCaseChange="0"
                    splitOnNumerics="1"
                            catenateWords="1"
                            catenateNumbers="1"
                            catenateAll="1"
                            preserveOriginal="1"
                    />
                </analyzer>
            </fieldType>
    </types>
    <fields>
        <field name="keyid" type="long" indexed="true" stored="false" required="true"/>
        <field name="combined" type="concatenated" indexed="true" stored="false"/>
    </fields>
    <uniqueKey>keyid</uniqueKey>
    <defaultSearchField>combined</defaultSearchField> 
    <copyField source="keyid" dest="keyid"/>  
    <solrQueryParser defaultOperator="OR"/>
</schema>

そして、私のdata-config.xmlファイルは次のようになります。

<dataConfig>
    <document name="products">
        <entity name="product" query="SELECT ProductId AS keyid, CONVERT(VARCHAR(18), ProductId) + ' ' + ProductName AS combined FROM Products"
            <field column="keyid" name="keyid"/>
            <field column="combined" name="combined"/>
        </entity>
    </document>
</dataConfig>

そして、Productsテーブルに次のようなレコードがあります

ProductId | ProductName

239289231 | Windows 7

セットアップとインデックス作成(を使用localhost:8089/sorl/dataimport?command=full-import)が成功したとすると、このクエリを実行しても結果が得られないのはなぜですか。

シナリオ1:localhost:8089/solr/select?q=combined:239289233

それでも、以下のクエリは私に結果を与えます(1つはkeyidフィールドから検索し、もう1つは結合されたフィールドから検索します):

シナリオ2:localhost:8089/solr/select?q=combined:Windows

シナリオ3:localhost:8089/solr/select?q=keyid:239289233

ここで使用しているTokenizerFactoryまたはFilterFactoryに問題がありますか?ProductIdSolrは、キャストして連結した後、文字列として扱うべきではありませんVARCHAR。したがって、Solrを現在のように呼び出すことができScenario 1ますか?

4

1 に答える 1

1

はい、ここでの問題はトークナイザーです。最初のトークナイザーLowerCaseTokenizerFactoryは数字を完全に削除するため、ProductId 値で検索して値を見つけることができません。あなたの例では、Windowsという単語のみをインデックス化しています。

おそらく値を小文字にしたいので、 をStandardTokenizerFactoryトークナイザーLowerCaseFilterFactoryとして、また値を小文字にするためのフィルターとして使用することをお勧めします。これには、インデックス付けされるトークンとして ProductId 値が含まれ、次のトークンに対して NGrams が構築されます - 239289231Windowsおよび7.

提案された変更された fieldType は次のとおりです。

  <fieldType name="concatenated" class="solr.TextField" positionIncrementGap="100" >
     <analyzer>
        <tokenizer class="solr.StandardTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" 
            maxGramSize="15" side="front"/>
        <filter class="solr.WordDelimiterFilterFactory"
             splitOnCaseChange="0"
             splitOnNumerics="1"
             catenateWords="1"
             catenateNumbers="1"
             catenateAll="1"
             preserveOriginal="1"
             />
      </analyzer>
   </fieldType>

また、Solr Wiki のAnalyzers, Tokenizers and Token Filtersページで、さまざまな機能の例を確認することをお勧めします (まだお持ちでない場合)。この場合、トークナイザーとフィルターの混同に過ぎなかったと思います。

于 2012-12-07T21:28:04.060 に答える