搜索空间,连字符,套管和标点符号的各种组合

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)

分析仪的屏幕截图:

Analyzer截图使用初始架构

我尝试了各种过滤器组合来试图解决这些限制,所以我在以下解决方案中遇到了无法解决的问题: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)

架构更改后的分析器: 在此输入图像描述

问题:

  1. 为什么"WalMart"与我的初始架构不匹配"Walmart"?Solr的分析器清楚地显示我说,它产生的过程中的时间索引3个标记:wal,mart,walmart.在查询期间:它产生了1个令牌:( walmart虽然不清楚为什么它只产生1个令牌),但我不理解为什么它不匹配,因为它walmart包含在查询和索引令牌中.

  2. 我在这里提到的问题只是一个用例.有一些稍微复杂的,如:

    撇号的词:"麦当劳","麦当劳","麦当劳","麦当劳","麦当劳","麦当劳"

    带有不同标点的单词:"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 标记器和小写标记器之间。

在搜索时,三个版本中的任何一个都将匹配索引中的同义词之一。


Ven*_*ama 2

在solrconfig.xml中升级Lucene版本(4.4到4.10)神奇地解​​决了这个问题!我不再有任何限制,我的查询分析器也按预期运行。

  • 从 4.4 到 4.10 是升级...:) (2认同)