Lucene使用WordDelimiterFilterFactory搜索文件名

时间:2013-02-13 09:39:20

标签: solr lucene

如果我搜索toto.pdf,会为搜索创建一个标记“pdf”,以便索引某些数据,包括文件名。

我想要的是,根据索引文件名:

MySupercool123girlfriend.jpg

并且能够将其与:

联系起来
supercool
supercool123
123
girlfriend
jpg

所以在索引处很容易使用WordDelimiterFilterFactory来创建一些标记,如:

my
supercool
mysupercool
mysupercool123
supercool123
123
girlfriend
jpg
girlfriend.jgp
etc...

问题是,在搜索时,我真的不知道该怎么做。

如果我在搜索时使用WordDelimiterFilterFactory,MySupercool123girlfriend.jpg甚至会与toto.jpg匹配,因为在这两种情况下都会创建一个令牌jpgtoto.jpg根本不应该在结果列表中,因此对于我来说,使用具有更好得分的合适结果并不是一个解决方案


您是否有建议索引和搜索文件名?

2 个答案:

答案 0 :(得分:1)

对于你的这个具体例子,即如果搜索是MySupercool123girlfriend.jpg,并且你希望它只返回包含整个字符串的文档,你可以保留一个copyField,比如名为{{ 1}},其fieldType为filename_str。字符串匹配将确保您获得完全匹配。这可能是您进行的第一级“完全匹配”搜索。

但是,我猜您希望搜索string以返回包含123girlfriend.jpg的文档。您可以进行二级搜索。从Solr 4.0开始,你可以进行像

这样的正则表达式搜索
MySupercool123girlfriend.jpg

(如果您在索引时在WordDelimiterFilterFactory中使用q=filename_str:/.*123girlfriend.jpg/ ,则此正则表达式查询也适用于filename字段本身。) 否则你可以做一个leading wild-card search,它也适用于早期的Solr版本。

如果您还希望preserveOriginal=1MySupercool.jpg匹配,那么我猜你必须手动完成DelimiterFilterFactory的工作并构建一个像

这样的正则表达式查询
MySupercool123girlfriend.jpg

另一个问题是q=filename_str:/.*My.*Supercool.*.jpg/ 将匹配大量文档,因此您可能希望拆分文件名和扩展名,并将它们保存为单独的字段。

答案 1 :(得分:1)

你能为你的用例DisMax mm参数找到一些有意义的吗?

请参阅http://wiki.apache.org/solr/DisMaxQParserPlugin#mm_.28Minimum_.27Should.27_Match.29

E.g。 mm = 100%,“MySupercool123girlfriend.jpg”只匹配其中包含所有[“my”,“supercool”,“123”,“boys”,“jpg”]条款的文件名

您可以找到一些不太严格但仍然给出相关结果的表达式。见http://lucene.apache.org/solr/4_1_0/solr-core/org/apache/solr/util/doc-files/min-should-match.html