【问题标题】:Solr query giving wrong results searching multi-word (separated by space) stringSolr 查询给出错误的结果搜索多字(由空格分隔)字符串
【发布时间】:2018-05-03 12:18:12
【问题描述】:

我已在 Solr 中为以下文档编制索引,其中 app_name 是多字字符串,例如“消防检查”,

{
    "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 检查”的 -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 中的 like 查询相同),它将检查子字符串和空格。

非常感谢您的帮助。

【问题讨论】:

    标签: solr


    【解决方案1】:

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

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

    不过,您也可以使用ComplexPhraseQueryParser 来获得对短语查询中通配符的支持:

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

    应该可以,只要您的标记中确实有大写字母(通配符会禁用许多过滤器,因此通常您需要匹配标记中的结尾语法。

    【讨论】:

    • 谢谢!我已将字段类型从 text_general 更改为 string 并且它正在工作。但是要搜索包含值“fire P”的所有记录,我必须编写以下查询:http://localhost:8983/solr/AxoSolrCollectionLocal/select?fq=app_name:fire\ P*&q=*:*
    • 如果您没有其他查询,您可以直接在q 中使用该查询 - 行为或多或少相同。
    猜你喜欢
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    相关资源
    最近更新 更多