Solr Ngram 匹配灾难

发布于 2024-12-27 07:09:32 字数 868 浏览 2 评论 0原文

这是我的(相当标准的)ngram 模式——

<fieldType name="ngram" class="solr.TextField" positionIncrementGap="100" stored="false" multiValued="true">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="15"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

现在laptop_ngram:"g74sx-a" 返回——

<arr name="laptop_ngram">
  <str>ASUS G74SX-A1 17.3-Inch Gaming Laptop</str>
</arr>

但是laptop_ngram:"g74sx-a1" 什么也没找到。

顺便说一句,转义“-”没有任何区别。

有什么想法吗?

This is my (pretty standard) ngram schema --

<fieldType name="ngram" class="solr.TextField" positionIncrementGap="100" stored="false" multiValued="true">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="15"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

now laptop_ngram:"g74sx-a" returns --

<arr name="laptop_ngram">
  <str>ASUS G74SX-A1 17.3-Inch Gaming Laptop</str>
</arr>

but laptop_ngram:"g74sx-a1" finds nothing.

BTW, escaping the "-" does not make any difference.

Any thought?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜点 2025-01-03 07:09:32

StandardTokenizerFactory 可能会对这个术语做一些事情。您可以在分析页面中检查这一点。

因此更改为 WhitespaceTokenizerFactory 可以解决该问题。

The StandardTokenizerFactory might do something to the term. You can check this in the analysis page.

So changing to WhitespaceTokenizerFactory could fix the problem.

我的奇迹 2025-01-03 07:09:32

感谢 O. Klein,他给我指明了新的方向。

我最终选择了 WhitespaceTokenizerFactory 加上 WordDelimiterFilterFactory ——

<fieldType name="ngram" class="solr.TextField" positionIncrementGap="100" stored="false" multiValued="true">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="15"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

它适用于“g74sx”、“g74sx-”、“g74sx-a”和“g74sx-a1”

但是,旅程并没有结束,因为我仍在探索原因--

“G74SX-XA1”与“g74sx-x”和“g74sx-xa1”一起找到,但不是“g74sx-xa”...

Thanks to O. Klein, who showed me new direction.

I finally settle with WhitespaceTokenizerFactory plus WordDelimiterFilterFactory --

<fieldType name="ngram" class="solr.TextField" positionIncrementGap="100" stored="false" multiValued="true">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="1" preserveOriginal="1"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.NGramFilterFactory" minGramSize="1" maxGramSize="15"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

which works for "g74sx", "g74sx-", "g74sx-a", and "g74sx-a1"

However, the journey didn't end here, as I'm still exploring why --

"G74SX-XA1" is found with "g74sx-x" and "g74sx-xa1", but not "g74sx-xa"...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文