从(n)varchar列中搜索数值

时间:2012-12-07 06:08:23

标签: c# sql-server solr

使用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>

我的产品表中有如下记录

产品编号|产品名称

239289231 | Windows 7

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

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

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

情景2: localhost:8089/solr/select?q=combined:Windows

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

问题是TokenizerFactory或FilterFactory在这里使用了吗?在将ProductId强制转换为VARCHAR并且连接后,Solr不应该将Scenario 1视为字符串 - 因此可以按照{{1}}中的方式调用它吗?

1 个答案:

答案 0 :(得分:1)

是的,这里的问题是tokenizer。您的第一个标记生成器,LowerCaseTokenizerFactory完全剥离了数字,因此您无法找到搜索并找到包含ProductId值的任何值。在您的示例中,它仅索引单词Windows。

我假设您可能希望小写该值,因此您希望使用StandardTokenizerFactory作为标记生成器,并使用LowerCaseFilterFactory作为过滤器来小写值。这将包含ProductId值作为要编制索引的令牌,并针对以下令牌构建NGrams - 239289231Windows7

以下是建议修改的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页面,了解各种工作的示例,如果您还没有。在这种情况下,它只是一个令牌器和我相信的过滤器之间的混合。