我是SOLR的新手,我正在实现它来搜索我们的产品目录。我在品牌名称、显示名称和类别字段上创建了ngram和edge ngram。
我正在使用edismax,并将qf定义为displayname_nge displayname_ng category_nge category_ng brandname_nge brandname_ng。
当我搜索“维生素c”(没有引号)时,我得到了所有的维生素。如果我用引号括起来,那么我只能得到维生素c。问题是,我不能总是用引号把查询字符串引起来,因为有人可能会输入“可嚼的维生素c”或“供应商x维生素c”。我尝试过mm参数,但没有成功。我也尝试了不同的提升级别,但仍然没有得到预期的结果。
任何建议都将不胜感激。谢谢
发布于 2014-05-16 00:42:43
只使用ngram字段进行搜索有什么原因吗?我不确定这就是您的问题所在,但您可能希望查看schema.xml中的ngram分析配置。我的一个索引中的一个如下所示:
<fieldType name="ngram" class="solr.TextField" >
<analyzer type="index">
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
</analyzer>
<analyzer type="query">
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
</analyzer>
</fieldType>虽然您可以看到这实际上是在使用更安全的EdgeNGramFilterFactory,但这里要注意的重要一点是minGramSize="2"。这意味着在索引过程中,将只创建至少包含两个字符的gram。“c”这个词?这根本得不到任何克。虽然您可以设置minGramSize="1"并重新构建索引,但单字符gram不是一个好主意,因为搜索“c”将匹配任何以“c”开头的文档(或使用NGramFilterFactory包含字母“c”)。
如果您当前使用的是带有minGramSize="2"的NGrams,搜索“ca”将会找到任何包含字母“ca”的连续单词的文档。这可能也不是您想要的。
我的首要建议是去掉ngram,而使用更普通的文本字段。您是否希望保留边框以获得更好的截断支持取决于您,但我怀疑如果文本字段至少在混合字段中,您会有更好的运气。
如果你想进一步了解ngram,你也可以在StackOverflow:"Can I protect short words from an n-gram filter in Solr?"上看看这个问题。
此外,您应该考虑使用Solr的内置分析工具来找出搜索失败的地方。您可以选择一个字段或fieldType,并为索引中输入的内容和正在搜索的内容提供值。它将向您展示分析如何针对这两个值进行分析,以便您可以看到每个字符串是如何分解的,以及为什么它会创建或不创建匹配的标记。该工具的网址取决于您是否在多核环境中,但如果您转到Solr的web界面,您应该能够在左侧找到Analysis链接。
更新:
现在我从你那里得到了更多的细节,并且正在重新考虑它,你得到的结果是非常容易解释的。
在minGramSize="1"上,你不加引号的搜索“维生素C”会查找包含“维生素C”(或者包含“维生素C”的更长的单词)和“c”(或者包含“c”的更长的单词)的记录。
在被引用的“维生素c”搜索中,“c”现在必须出现在紧跟在维他命之后的一个单词中,这使得它成为一个更有用的搜索,但仍然不是很好。你应该能够通过查找在维生素后面有一个词而不是维生素名称的记录来测试这一点。例如,在搜索“维他命b”时,应该找到提到“维他命片”的记录(因为“片剂”中有一个“b”)。在搜索“维生素c”时,应找到提及“维他命表”或“维生素缺乏症”的记录。
这样做的结果是,我强烈建议将一组用于搜索的字段与自动完成字段分开。对于实际的搜索步骤,带有minGramSize="1"的NGrams不会给出合理的结果。
发布于 2015-01-09 13:41:57
另一种选择是使用edismax - 'mm',您可以给出匹配的%。如果你付出100%,它会给你精确的匹配。75%的人会给你维他命单...您可以根据需要以编程方式处理%
发布于 2020-03-19 10:24:54
您可以考虑这样替换查询关键字:“‘维生素C’维生素C”。在这种情况下,匹配“维生素C”的记录可以获得比分别匹配“维生素C”和“C”的记录更高的分数。您的搜索结果仍将返回所有匹配的记录。请看看这是否有帮助,并随时发表意见。
https://stackoverflow.com/questions/23682133
复制相似问题