gpt4 book ai didi

solr - 使用空格、连字符、大小写和标点符号的各种组合进行搜索

转载 作者:行者123 更新时间:2023-12-02 05:09:43 32 4
gpt4 key购买 nike

我的架构:

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

我想要的组合:

"Walmart", "WalMart", "Wal Mart", "Wal-Mart", "Wal-mart"

给定这些字符串中的任何一个,我想找到另一个。

因此,共有 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)

我的架构的当前限制:

1. "Wal-Mart" -> "Walmart",
2. "Wal Mart" -> "Walmart",
3. "Walmart" -> "Wal Mart",
4. "Wal-mart" -> "Walmart",
5. "WalMart" -> "Walmart"

分析器截图:

Analyzer screenshot using initial schema

我尝试了各种过滤器组合来尝试解决这些限制,因此我被以下提供的解决方案迷惑了:Solr - case-insensitive search do not work

虽然它似乎克服了我所面临的限制之一(参见 #5 WalMart -> Walmart),但它总体上比我之前的情况更糟糕。现在它不适用于以下情况:

(Wal Mart,WalMart), 
(Wal-Mart,WalMart),
(Wal-mart,WalMart),
(WalMart,Wal Mart)
besides cases 1 to 4 as mentioned above

架构更改后的分析器: enter image description here

问题:

  1. 为什么“WalMart”与我的初始架构不匹配“Walmart”?Solr 分析器清楚地向我显示,它在索引时间内生成了 3 个 token :walmartwalmart。在查询期间:它生成了 1 个 token :walmart(虽然不清楚为什么它只生成 1 个 token ),但我无法理解为什么它不匹配,因为 walmart > 包含在查询和索引标记中。

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

    Words with apostrophes: "Mc Donalds", "Mc Donald's", "McDonald's", "Mc donalds", "Mc donald's", "Mcdonald's"

    Words with different punctuations: "Mc-Donald Engineering Company, Inc."

一般来说,针对这种需求对模式进行建模的最佳方法是什么? NGram ?在不同字段(以不同格式)索引相同数据并使用 copyField 指令( https://wiki.apache.org/solr/SchemaXml#Indexing_same_data_in_multiple_fields )?这对性能有何影响?

编辑:我的 Solr 模式中的默认运算符是 AND。我无法将其更改为 OR。

最佳答案

我们将连字符连接的单词视为一种特殊情况,并编写了一个自定义分析器,用于在索引时创建此 token 的三个版本,因此在您的情况下,wal-mart 将变为 walmart、wal mart 和 wal-mart。每个同义词都是使用自定义 SynonymFilter 编写的,该过滤器最初改编自 Lucene in Action 书中的示例。 SynonymFilter 位于空白分词器和小写分词器之间。

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

关于solr - 使用空格、连字符、大小写和标点符号的各种组合进行搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29783237/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com