0

如果我搜索 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根本不应该在结果列表中,所以这不是我的解决方案,让两个结果都具有更好的得分


您对索引和搜索文件名有什么建议吗?

4

2 回答 2

1

对于您的这个特定示例,即如果搜索是 forMySupercool123girlfriend.jpg并且您希望它只返回包含整个字符串的文档,您可以保留一个copyField,比如说 named filename_str,其 fieldType 是string。字符串匹配将确保您获得完全匹配。这可能是您进行的一级“完全匹配”搜索。

但是,我猜您可能希望搜索123girlfriend.jpg返回包含MySupercool123girlfriend.jpg. 您可以对此进行二级搜索。从 Solr 4.0 开始,您可以进行正则表达式搜索,例如

q=filename_str:/.*123girlfriend.jpg/

(如果您在索引时在 WordDelimiterFilterFactory 中使用,则此正则表达式查询也应该适用于filename字段本身preserveOriginal=1。)否则,您可以进行领先的通配符搜索,这也适用于早期的 Solr 版本。

如果您还想MySupercool.jpg匹配MySupercool123girlfriend.jpg,那么我想您将不得不手动完成 DelimiterFilterFactory 的工作并构造一个正则表达式查询,例如

q=filename_str:/.*My.*Supercool.*.jpg/

另一个问题是jpg要匹配很多文档,因此您可能希望拆分文件名和扩展名并将它们保留为单独的字段。

于 2013-02-18T02:52:40.597 回答
1

你能想出一些对你的用例有意义的 DisMax mm 参数吗?

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

例如 mm=100% 和 "MySupercool123girlfriend.jpg" 将仅匹配包含所有 ["my", "supercool", "123", "girlfriend", "jpg"] 术语的文件名

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

于 2013-02-18T20:21:42.977 回答