带有空格和同义词的 Solr 通配符查询
Solr wildcard query with whitespace and synonym
这个问题是这样的:Solr wildcard query with whitespace
我有一个看起来像这样的通配符查询:
q=location:los a*
我希望它匹配 "los angeles" 和 "los altos"。查询如:
q=location:los\ a*
工作正常,但如果我有同义词逻辑:(synonym.txt)
los,las
然后用"los l*"匹配"las lu"。好像不行work.How我可以这样做吗?
文件类型和文件配置:
<fieldType name="ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" stemEnglishPossessive="0" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="0" catenateAll="0" splitOnNumerics="0" preserveOriginal="1"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonym.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" stemEnglishPossessive="0" generateWordParts="0" generateNumberParts="0" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnNumerics="0" preserveOriginal="1"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<field name="location" type="ngram" indexed="true" stored="false"/>
您将 solr.SynonymFilterFactory
用于索引而非查询分析器,因此
当您搜索 "los l*"
时,它会查找以 los 而非 "las" 开头的字词。
使用分析器进行查询
将此行添加到您的查询分析器
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
希望这有效
看来是版本问题。我在项目中使用的是Solr 4.0,但是当我将Solr版本升级到5.4.1时,同义词逻辑正常。
我没有更改查询分析器。是为了特殊要求。
这个问题是这样的:Solr wildcard query with whitespace 我有一个看起来像这样的通配符查询:
q=location:los a*
我希望它匹配 "los angeles" 和 "los altos"。查询如:
q=location:los\ a*
工作正常,但如果我有同义词逻辑:(synonym.txt)
los,las
然后用"los l*"匹配"las lu"。好像不行work.How我可以这样做吗?
文件类型和文件配置:
<fieldType name="ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" stemEnglishPossessive="0" generateWordParts="0" generateNumberParts="0" catenateWords="1" catenateNumbers="0" catenateAll="0" splitOnNumerics="0" preserveOriginal="1"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonym.txt" ignoreCase="true" expand="true"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" stemEnglishPossessive="0" generateWordParts="0" generateNumberParts="0" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnNumerics="0" preserveOriginal="1"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<field name="location" type="ngram" indexed="true" stored="false"/>
您将 solr.SynonymFilterFactory
用于索引而非查询分析器,因此
当您搜索 "los l*"
时,它会查找以 los 而非 "las" 开头的字词。
使用分析器进行查询
将此行添加到您的查询分析器
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
希望这有效
看来是版本问题。我在项目中使用的是Solr 4.0,但是当我将Solr版本升级到5.4.1时,同义词逻辑正常。
我没有更改查询分析器。是为了特殊要求。