Solr 搜索拼写错误
Solr Search with wrong spell
我已将 Solr 与 My eComemrce Web 应用程序集成。我正在将产品标题和产品的许多其他字段索引到 Solr。现在我已经将 BLÅBÆRSOMMEREN 索引到产品 title/name 中。我还为标题字段添加了 EdgeNGram。由于 EdgeNGram,如果我搜索任何令牌,我都会得到结果。由于拼写检查,如果我搜索错误的拼写,如:BLÅBÆRISOMMEREN,我得到了结果。但是如果我搜索 BLÅBÆRI,我没有得到任何结果,因为没有任何相同的标记。
我想要结果中具有 BLÅBÆR 的产品,因为该标记存在。对于任何其他错误的拼写搜索也是如此。
我怎样才能做到这一点?任何帮助将不胜感激!
谢谢。
听起来您可能为索引和查询配置了不同的 Solr 标记化。
因此,在您的示例中,索引中可能会出现以下术语:
- B
- BL
- BLÅ
- BLÅB
- BLÅBÈ
- BLÅBÈR
- BLÅBÈRS
然而,由于您的查询词没有被处理成 ngram,您只是搜索
- BLÅBÈRI
未出现在您的索引词中。
这是使用 ngrams 时的常见做法,但在您的用例中听起来您希望在结果中 return 部分匹配。
检查您的 Solr 模式以确保您有一个匹配的 EdgeNGram 过滤器配置为查询时间,就像您为索引时间所做的那样,例如
<fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
</fieldType>
不过请确保您按 score
排序,因为此策略很可能会给您带来很多误报!
对于拼写错误的单词,您可以使用模糊查询(允许匹配与查询词的编辑距离为 ~1 或 ~2 的索引词)。
使用您的示例,BLÅBÆRISOMMEREN 与您的索引词的编辑距离为 1(一个字符差异)。
因此,查询 q=title:BLÅBÆRISOMMEREN~1
将匹配您的标题词,但 BLÅBÆRI 不会(如果没有上一个答案中的 ngram 方法。)。
如果您正在尝试构建 auto-suggest,您还可以研究 Solr 的 Suggester component,因为它还可以处理模糊建议,例如:(BLÅBÆRI -> BLÅBÈRSOMMEREN) 并且通常比传统的响应速度更快询问。
我已将 Solr 与 My eComemrce Web 应用程序集成。我正在将产品标题和产品的许多其他字段索引到 Solr。现在我已经将 BLÅBÆRSOMMEREN 索引到产品 title/name 中。我还为标题字段添加了 EdgeNGram。由于 EdgeNGram,如果我搜索任何令牌,我都会得到结果。由于拼写检查,如果我搜索错误的拼写,如:BLÅBÆRISOMMEREN,我得到了结果。但是如果我搜索 BLÅBÆRI,我没有得到任何结果,因为没有任何相同的标记。
我想要结果中具有 BLÅBÆR 的产品,因为该标记存在。对于任何其他错误的拼写搜索也是如此。
我怎样才能做到这一点?任何帮助将不胜感激!
谢谢。
听起来您可能为索引和查询配置了不同的 Solr 标记化。
因此,在您的示例中,索引中可能会出现以下术语:
- B
- BL
- BLÅ
- BLÅB
- BLÅBÈ
- BLÅBÈR
- BLÅBÈRS
然而,由于您的查询词没有被处理成 ngram,您只是搜索
- BLÅBÈRI
未出现在您的索引词中。
这是使用 ngrams 时的常见做法,但在您的用例中听起来您希望在结果中 return 部分匹配。
检查您的 Solr 模式以确保您有一个匹配的 EdgeNGram 过滤器配置为查询时间,就像您为索引时间所做的那样,例如
<fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
</fieldType>
不过请确保您按 score
排序,因为此策略很可能会给您带来很多误报!
对于拼写错误的单词,您可以使用模糊查询(允许匹配与查询词的编辑距离为 ~1 或 ~2 的索引词)。
使用您的示例,BLÅBÆRISOMMEREN 与您的索引词的编辑距离为 1(一个字符差异)。
因此,查询 q=title:BLÅBÆRISOMMEREN~1
将匹配您的标题词,但 BLÅBÆRI 不会(如果没有上一个答案中的 ngram 方法。)。
如果您正在尝试构建 auto-suggest,您还可以研究 Solr 的 Suggester component,因为它还可以处理模糊建议,例如:(BLÅBÆRI -> BLÅBÈRSOMMEREN) 并且通常比传统的响应速度更快询问。