Ven*_*ama 11 lucene solr textmatching string-matching solrj
我的架构:
<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase="true"
words="stopwords.txt"
enablePositionIncrements="true"
/>
<filter class="solr.WordDelimiterFilterFactory"
generateWordParts="1" generateNumberParts="1"
catenateWords="1" catenateNumbers="1" catenateAll="0"
splitOnCaseChange="1" splitOnNumerics="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="English"
protected="protwords.txt"/>
</analyzer>
</fieldType>
Run Code Online (Sandbox Code Playgroud)
我想要合作的组合:
"沃尔玛","沃尔玛","沃尔玛","沃尔玛","沃尔玛"
鉴于这些字符串中的任何一个,我想找到另一个字符串.
因此,有以下25种组合:
(第一列表示搜索的输入文本,第二列表示预期的匹配)
(Walmart,Walmart)
(Walmart,WalMart)
(Walmart,Wal Mart)
(Walmart,Wal-Mart)
(Walmart,Wal-mart)
(WalMart,Walmart)
(WalMart,WalMart)
(WalMart,Wal Mart)
(WalMart,Wal-Mart)
(WalMart,Wal-mart)
(Wal Mart,Walmart)
(Wal Mart,WalMart)
(Wal Mart,Wal Mart)
(Wal Mart,Wal-Mart)
(Wal Mart,Wal-mart)
(Wal-Mart,Walmart)
(Wal-Mart,WalMart)
(Wal-Mart,Wal Mart)
(Wal-Mart,Wal-Mart)
(Wal-Mart,Wal-mart)
(Wal-mart,Walmart)
(Wal-mart,WalMart)
(Wal-mart,Wal Mart)
(Wal-mart,Wal-Mart)
(Wal-mart,Wal-mart)
Run Code Online (Sandbox Code Playgroud)
我的架构的当前限制:
1. "Wal-Mart" -> "Walmart",
2. "Wal Mart" -> "Walmart",
3. "Walmart" -> "Wal Mart",
4. "Wal-mart" -> "Walmart",
5. "WalMart" -> "Walmart"
Run Code Online (Sandbox Code Playgroud)
分析仪的屏幕截图:

我尝试了各种过滤器组合来试图解决这些限制,所以我在以下解决方案中遇到了无法解决的问题:Solr - 不区分大小写的搜索不起作用
虽然它似乎克服了我的一个限制(参见#5 WalMart - > Walmart),但它总体上比我之前更糟糕.现在它不适用于以下情况:
(Wal Mart,WalMart),
(Wal-Mart,WalMart),
(Wal-mart,WalMart),
(WalMart,Wal Mart)
besides cases 1 to 4 as mentioned above
Run Code Online (Sandbox Code Playgroud)
架构更改后的分析器:

问题:
为什么"WalMart"与我的初始架构不匹配"Walmart"?Solr的分析器清楚地显示我说,它产生的过程中的时间索引3个标记:wal,mart,walmart.在查询期间:它产生了1个令牌:( walmart虽然不清楚为什么它只产生1个令牌),但我不理解为什么它不匹配,因为它walmart包含在查询和索引令牌中.
我在这里提到的问题只是一个用例.有一些稍微复杂的,如:
撇号的词:"麦当劳","麦当劳","麦当劳","麦当劳","麦当劳","麦当劳"
带有不同标点的单词:"Mc-Donald Engineering Company,Inc."
一般来说,用这种要求对模式进行建模的最佳方法是什么?NGrams?在不同的字段(以不同的格式)索引相同的数据并使用copyField指令(https://wiki.apache.org/solr/SchemaXml#Indexing_same_data_in_multiple_fields)?这有什么性能影响?
编辑:我的Solr架构中的默认运算符是AND.我无法将其更改为OR.
小智 5
我们将连字符视为一种特殊情况,并编写了一个自定义分析器,在索引时使用该分析器来创建此令牌的三个版本,因此在您的情况下,wal-mart 将变为 walmart、wal mart 和 wal-mart。这些同义词中的每一个都是使用自定义 SynonymFilter 写出的,该过滤器最初改编自 Lucene in Action 一书中的示例。SynonymFilter 位于 Whitespace 标记器和小写标记器之间。
在搜索时,三个版本中的任何一个都将匹配索引中的同义词之一。
在solrconfig.xml中升级Lucene版本(4.4到4.10)神奇地解决了这个问题!我不再有任何限制,我的查询分析器也按预期运行。