我在solr中有一些数据。我想搜索哪个名称是Chinmay Sahu
如下所示我在输出中有3个结果。但我得到3而不是1.因为内容name
部分搜索了。
我想完全搜索那些只有内容来Chinmay Sahu
的名字。
输出:
"docs": [
{
"id": "741fde46a654879949473b2cdc577913",
"content_id": "1277",
"name": "Chinmay Sahu",
"_version_": 1596995745829879800
},
{
"id": "4e98d680efaab3afe051f3ddc00dc5f2",
"content_id": "1825",
"name": "Chinmay Panda",
"_version_": 1596995745829879800
}
{
"id": "741fde46a654879949473b2cdc577913",
"content_id": "1259",
"name": "Sasmita Sahu",
"_version_": 1596995745829879800
}
]
查询:
name:Chinmay Sahu
预期:
"docs": [
{
"id": "741fde46a654879949473b2cdc577913",
"content_id": "1277",
"name": "Chinmay Sahu",
"_version_": 1596995745829879800
},
]
请帮忙
答案 0 :(得分:1)
尝试这样做
name:"Chinmay Sahu"
您需要执行短语查询以匹配确切的名称。
我猜你的情况是名字字段正在使用标准标记器,如果存在空格,它将分割标记。因此,在对所有3个文档进行索引时,会有一个名为“chinmay”的标记。
使用
进行搜索时name:Chinmay Sahu
Solr会像这样搜索它,因为如果在令牌solr自动在default_field中搜索它之前没有指定fieldName(但是默认字段从solr 7.3中删除,那么它取决于你使用的solr版本。 )
Name:chinmay AND default_field:sahu
因此,由于所有三个文档都将chinmay作为索引中的标记,因此查询将匹配所有3个文档。
现在我不知道你的默认字段是什么?你可以发布你的solr架构吗?这样我们就可以解释为什么你会看到这3个文档。
答案 1 :(得分:1)
由于root545已经解释过field:foo bar
将在默认搜索字段中的foo
和field
中搜索bar
,我会建议你好像不要我想关注用于搜索的精确Lucene语法。 edismax查询解析器非常适合将类型化的搜索字符串与正在搜索的字段以及是否希望所有标记匹配。
在这种情况下,查询只是Chinmay Sahu
,而您设置q.op=AND
(所有字词必须匹配),defType=edismax
(使用edismax查询解析器)和{{1 (搜索名称字段):
qf=name
您还可以调整不同的短语参数,以确保具有完全相同序列的标记的名称将比具有相反顺序的标记更高(即Sahu Chinmay)。
如果这是一个没有用户实际输入建议的程序化搜索,那么使用建议的短语搜索就可以了(q=Chinmay Sahu&q.op=AND&defType=edismax&qf=name
)。
答案 2 :(得分:0)
我建议使用像
这样的查询 name:(Chinmay Sahu)
并确保默认运营商AND
位于设置或查询字符串中,如q.op=AND
使用这种方法,您可以更轻松地使用用户输入,因为您不需要过多地解析它。