我正在使用查询字符串搜索Solr:
q=now+I+can+see+this
我正在搜索的文字,"现在我可以在field1
字段中的索引文档中看到此",确实。然而,当我执行上述搜索时,返回零文档。
在我的solrconfig.xml中,我已经定义了这些默认值:
<str name="q.alt">*:*</str>
<str name="q.op">AND</str>
<str name="defType">edismax</str>
<str name="qf">
field1 field2^2 field3^2 field4
</str>
<str name="pf">
field1
</str>
我可以获取文档的唯一方法是将qf更改为:
<str name="qf">
field1
</str>
换句话说,要删除field2,field3,field4会增加。我的理解是,qf
提升了分数,但不会对正在发生的搜索产生影响,所以我不明白为什么删除其他字段会导致我能够找到具有给定查询的文档。
当我在查询字符串上放置debugQuery = true时,这就是我在解析查询中看到的内容,但没有任何内容在我身上跳出来(不可否认,我在Solr中调试查询仍然是新手。)
(+((DisjunctionMaxQuery((field4:now | field1:now | field3:now^2.0 | field2:now^2.0)) DisjunctionMaxQuery((field4:i | field1:i | field3:i^2.0 | field2:i^2.0)) DisjunctionMaxQuery((field4:can | field1:can | field3:can^2.0 | field2:can^2.0)) DisjunctionMaxQuery((field4:see | field1:see | field3:see^2.0 | field2:see^2.0)) DisjunctionMaxQuery((field4:this | field3:this^2.0 | field2:this^2.0)))~5) DisjunctionMaxQuery((field1:\"now i can see\")))/no_coord
这里是parsedquery_tostring:
+(((field4:now | field1:now | field3:now^2.0 | field2:now^2.0) (field4:i | field1:i | field3:i^2.0 | field2:i^2.0) (field4:can | field1:can | field3:can^2.0 | field2:can^2.0) (field4:see | field1:see | field3:see^2.0 | field2:see^2.0) (field4:this | field3:this^2.0 | field2:this^2.0))~5) (field1:\"now i can see\")
我错过了什么?
答案 0 :(得分:3)
为什么你在field1中没有“this”?使用时是否相同:
<str name="qf">
field1
</str>
您使用的是拼写检查还是模糊搜索功能?
修改:
如果您仅对field1使用stopWords,则会发生以下情况:
使用时:
<str name="q.alt">*:*</str>
<str name="q.op">AND</str>
<str name="defType">edismax</str>
<str name="qf">
field1 field2^2 field3^2 field4
</str>
您希望查询的每个术语在任一字段(field1,field2,field3和field4)中至少出现一次。
对于前4个术语,你有你想要的,每个术语出现在一个字段(field1)。
对于 this ,您使用的是在查询field1时将删除的stopWord。因此,您不是在field1中搜索 this ,而是在field2,field3和field4中查找此术语。但此不会出现在这些字段中。最后,您无法找到查询的所有条款,并且您正在使用AND运算符,因此返回0个文档。
使用时:
<str name="qf">
field1
</str>
您不是在寻找 this 一词,因为在您使用搜索的所有字段中,由于stopWords文件,该术语将被删除。因此,您将找到查询的所有条款,并且您将获得预期的结果。
我希望我很清楚,乐于助人。