Solr查询提供错误的结果搜索多字(由空格分隔)字符串

时间:2018-05-03 12:18:13

标签: solr

我在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中的类似查询相同),它将检查子字符串,并且空格不重要。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

首先 - 您的查询并不意味着您的意思。 app_name:*fire P*表示“搜索字段fire中以app_name结尾的任何内容和/或默认搜索字段中以p开头的任何内容”。由于您没有使用字段名称作为第二个值的前缀,因此将使用默认搜索字段。

如果要在类似字段内搜索子字符串匹配(即包含“fire P”的内容作为值内的子字符串,则必须将字段类型设为字符串字段 - 或者包含关键字的字段tokenizer - 这样字段保留其实际值,并且它不会被进一步处理/过滤/标记化。如果它被标记化,那些标记(即fireinspection等)将被单独存储。 ll必须正确地转义任何空格并查询单个字段(即app_name: fire \ P `),并且根据用例,除非您同时启用了ReversedWildcardFilter,否则性能可能会受到影响。

但是,您也可以使用ComplexPhraseQueryParser在词组查询中获得对wilcards的支持:

{!complexphrase inOrder=true}app_name:"*fire P*"

应该可以工作,只要你的标记中实际上有大写字母(通配符会禁用许多过滤器,所以通常你会想要匹配标记中的结束语法。