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 表中有如下记录

产品 ID|产品名称

239289231|Windows 7

假设设置和索引成功(使用localhost:8089/sorl/dataimport?command=full-import),为什么我在运行此查询时不会得到结果:

场景一:localhost:8089/solr/select?q=combined:239289233

然而,下面的查询确实给了我结果(一个从keyid字段搜索,另一个从组合字段搜索):

场景二:localhost:8089/solr/select?q=combined:Windows

场景 3:localhost:8089/solr/select?q=keyid:239289233

问题是这里使用的 TokenizerFactory 或 FilterFactory 吗?Solr 不应该ProductId在将其转换为并连接之后将其视为字符串VARCHAR- 因此可以按照我正在做的方式调用它Scenario 1吗?

4

1 回答 1

1

是的,这里的问题是标记器。您的第一个标记器,LowerCaseTokenizerFactory完全去掉了数字,这就是为什么您找不到搜索并找到任何具有您的 ProductId 值的值的原因。在您的示例中,它仅索引单词 Windows。

我假设您可能希望将值小写,因此您希望将StandardTokenizerFactory用作标记器,并LowerCaseFilterFactory用作过滤器以小写值。239289231这将包括 ProductId 值作为要索引的标记,并根据以下标记构建 NGrams -Windows7.

这是建议修改的 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 和 Token Filters页面,了解各种工作方式的示例(如果您还没有的话)。在这种情况下,我相信它只是标记器和过滤器之间的混合。

于 2012-12-07T21:28:04.060 回答