gpt4 book ai didi

search - Solr 在零件号中搜索破折号

转载 作者:行者123 更新时间:2023-12-03 22:21:41 25 4
gpt4 key购买 nike

我在如何构建 Solr 查询或如何设置模式以使我们的网络商店中的搜索更好地工作方面遇到了一些困难。

首先是一些配置(Solr 4.2.1)

<field name="mfgpartno" type="text_en_splitting_tight" indexed="true" stored="true" />
<field name="mfgpartno_sort" type="string" indexed="true" stored="false" />
<field name="mfgpartno_search" type="sku_partial" indexed="true" stored="true" />

<copyField source="mfgpartno" dest="mfgpartno_sort" />
<copyField source="mfgpartno" dest="mfgpartno_search" />

<fieldType name="sku_partial" class="solr.TextField" omitTermFreqAndPositions="true">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="1" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/>
<filter class="solr.NGramFilterFactory" minGramSize="4" maxGramSize="100" side="front" />
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.TrimFilterFactory" />
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="false"/>
</analyzer>
</fieldType>

让我把它分解成几个阶段(我只会深入到足以复制问题的程度——初始阶段不使用 edismax,这是我们选择在我们的网站上使用的):
  • q=DV\-5PBRP <- 通过此查询,我得到 18 个结果,但不是我要查找的结果(这很可能是对默认的 df 在产品名称字段上搜索的结果 - 很好)
  • q=mfgpartno_search:DV\-5PBRP <- 这给了我我正在寻找的 1 个结果,但是由于我需要在网站上进行查询构建,如果我可以使用 q 会更好参数如阶段 1。
  • q=DV\-5PBRP&defType=edismax&qf=mfgpartno_search <- 这也给了我我正在寻找的 1 个结果,但同样是由于网站搜索 qf需要跨越更多领域。因为它需要搜索更多字段(实际 qf = productname_search shortdesc_search fulldesc_search mfgpartno_search productname shortdesc fulldesc keywords )以获得更准确的搜索,我实现了第 4 阶段。
  • q=DV\-5PBRP&defType=edismax&qf=mfgpartno_search&q.op=AND <- 通过此测试,我得到了 0 个结果-尽管这对于我们网站上的大多数搜索都非常有效。

  • 我在搜索中遇到的大问题是像破折号这样的特殊字符有时必须是字面意思,有时用作产品名称或描述中的分隔符。有时人们甚至会在零件号搜索中搜索或用空格替换破折号,它仍应显示相关数据。

    我有点困惑如何让这个特殊字符搜索工作 - 特别是因为它与这个 mfgpartno_search 字段有关。我如何配置架构或查询(或两者)以使其正常工作?

    最佳答案

    也许您可以尝试使用正则表达式模式标记器,并为您的文章编号制作合适的正则表达式。 Lucene(Solr 的基础)非常专注于散文的标记化。

    您在这里想要的可能是 N-gram 分割,以及 1-gram?也许破折号被空格替换了,比如

    DV-5PBRP -> {DV 5PBRP, DV, 5P, BR, PB, RP, D, V, 5, P, B, R}

    如您所见,对于非常小的字段,索引将非常大。确保结果的排名对较大的 ngram 有很大的权重。

    我确实认为您应该删除文章编号字段的停用词列表。

    N-gram 大小应该从 1 或 2 开始。

    只需确保各种分析器不会:

  • 吞下破折号
  • 删除单个或几个字符(这些通常在停用词列表中)
  • 删除数字
  • 关于search - Solr 在零件号中搜索破折号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29976132/

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