【问题标题】:Error searching *n@domain* in apache solr在 apache solr 中搜索 *n@domain* 时出错
【发布时间】:2014-06-09 16:11:05
【问题描述】:

字段定义

<field name="email" type="text_general" indexed="true" stored="true" />     

查询

email : "*n@domain*"    

结果

没有数据。

我的问题是,我实际上在 solr 中索引了符合我的标准的数据。但它没有反映在查询结果中。我的查询模式有问题吗?

【问题讨论】:

  • 好的。你的问题是......?
  • 将其添加到问题中 - 问题应该能够独立存在,而无需将重要信息(例如实际问题是什么)留给 cmets 作为事后的想法.

标签: java solr lucene


【解决方案1】:

我猜你的字段中没有文本 *n@domain*。相反,您在学期中间的某个地方有n@domain(或者您相信)。您可能会遇到一些问题。我会假设你的领域使用StandardAnalyzer

首先,短语查询中没有通配符。 field:"query terms" 是一个短语查询,这意味着匹配可以跨越多个(分析后)术语。查询解析器语法不包括对短语查询中通配符的任何支持。因此,您查询中的星号就是字面星号。

其次,现在您正在搜索email:*n@domain*,好多了,但仍然没有运气。通配符查询绕过分析,您的电子邮件很可能在索引中被分析。对于像“test@domain.com”这样的条目,您实际上可能拥有三个术语“test”、“domain”和“com”。您可以使该字段不被分析以像您在此处指出的那样进行搜索,但这实际上取决于您确定这是否是正确的方法。

一旦你解决了这个问题,你可能会有一些工作,但如果糟糕的话,你可能会注意到这种表现。默认情况下,前导通配符通常被禁用,因为它们会导致糟糕的性能,因为它们需要对所有术语进行线性扫描才能枚举匹配项,而不是有效地使用索引。有一些策略可以允许使用前导通配符而不会对性能造成严重影响,例如 ReversedWildcardFilter

【讨论】:

  • 只是一个小更新。从 4.8 开始,可以在短语中使用通配符。根据SOLR-5926,Cwiki 文档不是最新的,但可以在旧 wiki ComplexPhraseQueryParser 找到一些文档。
【解决方案2】:

删除查询中的引号,它应该可以工作。

查询字符串email:*n@domain*被解析成一个WildcardQuery,这就是你想要的。

查询字符串 email:"*n@domain*" 被解析为 PhraseQuery,其中包含两个术语 email:nemail:domain。请注意,通配符实际上已被删除,并且短语已被标记化。

为什么?根据 Apache Solr 参考指南 4.8,p。 180,“通配符可以应用于单个术语,但不能应用于搜索短语。”通过在查询中添加引号,您是在告诉 Solr 搜索引用的短语,而不是将未引用的字符串视为一个单词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-25
    相关资源
    最近更新 更多