Solr通配符搜索结果不正确

7xllpg7q  于 2022-11-23  发布在  Solr
关注(0)|答案(4)|浏览(189)

当我进行通配符查询时,我得到了一些意外的结果。我在solr ui中使用了solr 6.6.0. edismax处理程序。以下查询在没有通配符的情况下返回了预期的结果- firstNames:James,但是当我添加通配符时,没有找到任何结果。x1c 0d1xx 1c 1d 1x对于firstNames字段,我使用默认的fieldType text_en以及默认的标记器和筛选器。当我对firstNames:Stephen和firstNames:Stephen* 运行完全相同的查询时,我在通配符和非通配符搜索中都得到了结果。以下是我在schema.xml中的字段xml:
第一个

rkue9o1l

rkue9o1l1#

当您执行通配符查询时,分析链 * 未被调用 *(好吧,这是一个小谎言-它确实被调用了,但只有MultiTermAware组件才被调用-这通常意味着LowercaseFilter是唯一仍处于活动状态的组件)。
因为你有一个词干过滤器和一个所有格过滤器,所以James上的结尾s被删除了,因为这只发生在索引时间(记住,当你使用通配符时,查询时通常会跳过分析链),所以标记jame被存储在索引中。
当您进行查询firstNames:James*时,您要求Solr“查找包含以James开头的标记的任何文档。由于存储的是标记jame,因此没有与james匹配的标记。
当您尝试使用Stephen执行此操作时,词干过滤器或所有格过滤器都不会删除单词的结尾,因此Stephen*会查找任何以stephen开头的标记,由于该标记存在(没有任何更改),因此会返回匹配项。
解决方案取决于您的用例;不需要对名称字段进行词干或所有格过滤,因为这对名称没有实际意义(相反,您可以应用自己的逻辑来匹配类似的名称)。另一种选择是使用ngramfilter,有效地为每个前缀和中缀版本的令牌生成一个令牌(一月十日、一月十一日、一月十二日、一月十三日、一月十四日)。

disbfnqx

disbfnqx2#

1.不要删除停用词。这是20世纪70年代的一个节省空间的方法。它使一些词无法搜索,所以像“维生素a”这样的查询永远不会起作用,因为“a”是一个停用词。下面是一篇博客文章,列出了100%停用词的电影标题。
https://observer.wunderwood.org/2007/05/31/do-all-stopword-queries-matter/
1.不要在词干分析中使用通配符。这将在词干上显示匹配项,而不是表面单词。您需要一个单独的字段,只使用小写过滤器。
1.不要在人名上使用词干。例如,你不想把“Steve Jobs”词干为“Steve Job”,或者把“William Golding”词干为“William Gold”。
1.更好的是,使用ICU折叠过滤器,而不仅仅是小写字母。
https://lucene.apache.org/solr/guide/8_7/filter-descriptions.html#icu-folding-filter

gtlvzcf8

gtlvzcf83#

关于停用词,对于“我必须使用停用词吗”这个问题的回答不是“是”或“否”。而是“为什么不”,而是根据您的数据智能地使用。对于药物数据库,“a”、“b”、“c”......不应该在停用词定义文件中。对于100%停用词数据库的电影标题,标题字段不得使用停用词。但是也许描述字段应该。

eivgtgni

eivgtgni4#

  • 因此,OP可能不需要在这里(在名称字段上)进行词干处理,但对于一般情况,*

通过在分析链中的这些过滤器之前添加KeywordRepeatFilterFactory,可以使通配符查询和模糊搜索与词干分析器、所有格过滤器和任何其他可能截断标记的过滤器一起正常工作,以便原始标记和词干化标记都得到索引:
将每个令牌发出两次,一次带有KEYWORD属性,一次不带有。
如果放在词干分析器之前,结果将是未词干化的标记与词干化的标记保留在相同的位置。与原始术语完全匹配的查询将获得更好的得分,同时仍保持词干化的召回优势。保留原始标记的另一个好处是通配符截断将按预期工作
这允许避免必须定义两个不同的字段类型(stemmed与unstemmed),或者为了修复通配符查询的唯一目的而使用ngram过滤器。

相关问题