使用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}}中的方式调用它吗?
答案 0 :(得分:1)
是的,这里的问题是tokenizer。您的第一个标记生成器,LowerCaseTokenizerFactory
完全剥离了数字,因此您无法找到搜索并找到包含ProductId值的任何值。在您的示例中,它仅索引单词Windows。
我假设您可能希望小写该值,因此您希望使用StandardTokenizerFactory
作为标记生成器,并使用LowerCaseFilterFactory
作为过滤器来小写值。这将包含ProductId值作为要编制索引的令牌,并针对以下令牌构建NGrams - 239289231
,Windows
和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页面,了解各种工作的示例,如果您还没有。在这种情况下,它只是一个令牌器和我相信的过滤器之间的混合。