带有空格的 solr 查询

Posted

技术标签:

【中文标题】带有空格的 solr 查询【英文标题】:solr query with white space 【发布时间】:2011-08-13 00:12:06 【问题描述】:

我搜索一个词,我得到的结果与 facet 如下:

<lst name="itemtype">
<int name="Internal">108</int>
<int name="Users">73</int>
<int name="Factory">18</int>
<int name="Supply Chain Intermediaries">6</int>
<int name="Company">1</int>
<int name="Monitor/Auditor firm">0</int>
</lst>

然后我写了fq=itemtype:Factory这样的条件。我得到结果。但我没有得到fq=itemtype:Supply Chain Intermediaries 的结果。 我认为问题在于条件中的空间(供应链中介)。我也试过urlencode(用%20替换空格)。但这没有用。各位大神能帮我解决一下吗?

更新:

对于单个值,它工作正常。我这样构建查询:

http:localhost:8080/solr/select/?q=adidas&version=2.2&indent=on&facet=on&start=0&rows=20&fq=!raw f=itemtypeSupply Chain Intermediaries

但我需要写多个值。没有raw的原始查询如下

http://localhost/solr/select/?q=adidas&version=2.2&indent=on&facet=on&start=0&rows=20&fq=(itemtype:Company itemtype:Supply Chain Intermediaries)

你们能帮我解决这个问题吗?

【问题讨论】:

【参考方案1】:

我猜你可以使用

fq=!raw f=itemtypeSupply Chain Intermediaries

为此目的

对于 Solr 版本 >= 4.0,您必须使用 !term 而不是 !raw

http://mail-archives.apache.org/mod_mbox/lucene-solr-user/201012.mbox/%3C4D121F73.3090706@jhu.edu%3E

祝你有美好的一天。

【讨论】:

我编写了新的 solr 查询。请您检查并提出建议。 @Brahmaji 您需要过滤器之间的 OR 操作还是 AND 操作?对于 AND,您可以简单地编写多个 fq 过滤器。但我猜你在 OR 上运气不太好。也许您可以尝试在双引号之间写下您的值,例如fq=text:"Chain Intermediaries"。不过我还没试过。【参考方案2】:

您的 itemtype 字段是如何分析的?

如果是字符串类型,则使用:

fq=itemtype:"Supply Chain Intermediaries"

否则你也可以试试:

fq=itemtype:(Supply Chain Intermediaries)

假设 OR 是您配置中的默认运算符,text 是默认搜索字段,您的查询将被翻译为:

fq=itemtype:Supply OR text:(Chain Intermediaries)

根据默认搜索字段搜索链和中介。

【讨论】:

这有帮助。谢谢。但是当我们有一些带有空格的字段名时怎么办?请指教。 +1 谢谢,顺便说一句,我使用的是lbdremy.github.io/solr-node-client,并且没有数组输入类型的转换,所以必须手动完成。 我正在使用 Solr Criteria(fieldname).contains(value) 构建查询,但对我不起作用。有什么建议吗?【参考方案3】:

这并不能直接回答这个问题,但它可能有助于解决这个问题:

在发布到 Solr 之前删除空格。

对于用于分面而非搜索的字段,用空格存储值并不重要。该值只是被视为键。像这样存储itemtype字段:"supplychainintermediaries", "monitorauditorfirm"

当您向用户显示构面值时,只需使用将键值映射到显示值的字典即可。像这样:

"supplychainintermediaries" --&gt; "Supply Chain Intermediaries" "monitorauditorfirm" --&gt; "Monitor/Auditor Firm"

【讨论】:

【参考方案4】:

我尝试了这里提到的不同解决方案,但都没有奏效。但是我是这样解决的:

fq=itemtype: *Supply\ Chain\ Intermediaries*

这里的空格会被\转义

上面的字符串将匹配字符串Lorem Supply Chain Intermediaries Ipsum

如果您有一个单词以Supply Chain Intermediaries Ipsum 开头 那么就给

fq=itemtype: Supply\ Chain\ Intermediaries*

【讨论】:

【参考方案5】:

我通过替换解决了空白问题:

$tmp[] = $name . ':' . $this->_escapeValue($value);

与:

$tmp[] = $name . ':' .'"'. $this->_escapeValue($value).'"';

表示在SolrSource.php文件中的转义值后面加上引号。

【讨论】:

以上是关于带有空格的 solr 查询的主要内容,如果未能解决你的问题,请参考以下文章

solr facet 如何不分词

Solr查询参数

solr 查询

ucanaccess :带有空格的意外令牌

Solr查询参数

Solr查询中的双引号