我在Solr中索引了以下文档 app_name 是多字符串,例如“Fire inspection”,
{
"app_name":"Fire inspection",
"appversion":1,
"id":"app_1397_version_2417",
"icon":"/images/media/default_icons/app.png",
"type":"app",
"app_id":1397,
"account_id":556,
"app_description":"fire inspection app",
"_version_":1599441252925833216}]
}
如果我执行Solr查询,Solr返回错误的响应,
查询:
http://localhost:8983/solr/AxoSolrCollectionLocal/select?fq=app_name:*fire P*&q=*:*
我正在搜索其app_name包含“fire P”的记录,但是获取其app_name包含“fire inspection”的-response。这里,字符串'Fire P'与下面的记录不匹配,但仍然由Solr响应。
Response:
{
"app_name":"Fire inspection",
"appversion":1,
"id":"app_1397_version_2417",
"icon":"/images/media/default_icons/app.png",
"type":"app",
"app_id":1397,
"account_id":556,
"app_description":"fire inspection app",
"_version_":1599441252925833216}]
}
有人可以帮我解决Solr查询(与SQL中的类似查询相同),它将检查子字符串,并且空格不重要。
非常感谢您的帮助。
答案 0 :(得分:0)
首先 - 您的查询并不意味着您的意思。 app_name:*fire P*
表示“搜索字段fire
中以app_name
结尾的任何内容和/或默认搜索字段中以p
开头的任何内容”。由于您没有使用字段名称作为第二个值的前缀,因此将使用默认搜索字段。
如果要在类似字段内搜索子字符串匹配(即包含“fire P”的内容作为值内的子字符串,则必须将字段类型设为字符串字段 - 或者包含关键字的字段tokenizer - 这样字段保留其实际值,并且它不会被进一步处理/过滤/标记化。如果它被标记化,那些标记(即fire
,inspection
等)将被单独存储。 ll必须正确地转义任何空格并查询单个字段(即app_name: fire \ P `),并且根据用例,除非您同时启用了ReversedWildcardFilter,否则性能可能会受到影响。
但是,您也可以使用ComplexPhraseQueryParser在词组查询中获得对wilcards的支持:
{!complexphrase inOrder=true}app_name:"*fire P*"
应该可以工作,只要你的标记中实际上有大写字母(通配符会禁用许多过滤器,所以通常你会想要匹配标记中的结束语法。