【问题标题】:How to do a complex phrase keyword search in solr如何在 solr 中进行复杂的短语关键字搜索
【发布时间】:2015-08-19 06:52:27
【问题描述】:

谁能告诉我如何在 solr 中进行复杂的短语搜索,例如:如果用户输入“and MAC F1:65”,结果中应该有“and MAC F1:65”,这似乎如果我通过以下查询,则对以 F1:65 开头的 MAC 地址(MAC 地址为 F1:65:CA:F0:00:00 )工作正常。

display_string:"and MAC F1:65"

但是如果只想搜索MAC地址的一部分,假设我的查询是“and MAC 65:CA”,即使我转义了分号,上面的命令也不起作用,我也尝试过传递通配符,但是他们也不工作。

还有,这是什么意思:

"msg": "查询中没有指定字段名,也没有通过'df'参数指定默认值"

我是初学者,我花了两天时间试图解决这个问题,我需要一个插件来做到这一点吗?

编辑:如果我使用 dismax 插件将查询分解为 (+and +MAC +65\:CA),它会起作用,但是 Lucene 查询没有其他方法可以做到这一点吗?

这是核心的架构:

<schema name="autoSolrSchema" version="1.5">
<types>
<fieldType class="org.apache.solr.schema.TextField" name="TextField">
<analyzer>
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType class="org.apache.solr.schema.TrieDateField" name="TrieDateField"/>
<fieldType class="org.apache.solr.schema.UUIDField" name="UUIDField"/>
<fieldType class="org.apache.solr.schema.TrieIntField" name="TrieIntField"/>
<fieldType class="org.apache.solr.schema.StrField" name="StrField"/>
</types>

<fields>...

【问题讨论】:

  • 能否提供用于索引和查询阶段的FieldType声明?
  • 这里是&lt;field indexed="true" multiValued="false" name="display_string" stored="true" type="TextField"/&gt; 我不明白您所说的查询阶段是什么意思?我没有为查询阶段传递任何字段类型参数..
  • 能否提供 display_string 的定义?
  • display_string 是文本类型的 cassandra 键空间中的一列...这是您想知道的吗?我正在 cassandra/dse 上使用 solr ..
  • 没有。你的schema.xml 应该有一个 FieldType 标记声明,它定义了标记器和一组过滤器,以便在索引之前处理这个字段。例如: text_general 是使用StandardTokenizerFactory 和一些StopwordFilter 的一种。 text_general

标签: solr solr4


【解决方案1】:

因为您有两个不同的问题:

display_string 是否命中取决于字段 display_string 的定义,以及它的处理方式。如果它是string (StrField),那么您将无法在该领域中击中任何东西。如果它是text_general(这是示例配置中提供的默认类型之一),'down' 和 'new' 至少应该会命中,而 '65:CA' 也应该有效 - 尽管这里可能存在差异基于字段的处理方式。

错误消息no field name specified in query and no default specified via 'df' param 的确切含义是 - 您没有在查询中包含字段名称,并且 Solr 不知道默认搜索哪个字段,因为也没有提供 df 参数。 foo:barfoo 字段中搜索值 bar,但如果您只提供 bar,Solr 不知道要搜索哪个字段,除非存在 df(或配置中的 defaultSearchField,是这样做的旧方式)。

如果您使用的是 (e)dismax 查询解析器,您还可以使用 qf 参数一次搜索多个字段,并包括不同字段之间的权重。 qf=display_string macaddr 将同时搜索 display_stringmacaddr 字段。

【讨论】:

  • display_string:+down +new "65:CA"~ 有效,但当我使用时间戳降序选项进行排序时,它也会显示没有 mac 地址 65:CA 的值。这就是您所说的“虽然 '65:CA' 也应该起作用 - 尽管根据字段的处理方式可能会有所不同”?
  • 在solr服务器界面上似乎与dismax插件完美运行,我该如何写作为查询?
  • 只需使用defType=dismax,或者根据使用的库,在那里设置查询处理器/类型。应该有据可查。
  • 好吧,我看到了,但我又遇到了另一个问题,dismax 似乎在界面上工作正常;在界面上的 qf 字段中,我使用了id:4 AND gr_id: (0 1 2) AND display_string,在 q 字段中我输入了+down +new +0f\:cd,这给了我正确的结果,但我想构建一个 solr 查询,因为我在 datastax/cassandra 上使用 solr。所以,当我使用{!defType=dismax mm=100%} id:4 AND gr_id: (0 1 2) AND display_string:(+down +new +0f\:cd) 作为查询时,我在界面上没有得到任何结果。
  • qf 字段意味着有字段名称,而不是查询。使用 debugQuery 查看您的查询是如何解析的,删除部分以查看匹配停止的位置,如果您要在每个字段中搜索以 fieldname 为前缀的值,您可能不需要 dismax。
【解决方案2】:

当您在词条查询中使用double quotes 时,它会将其视为短语,并且查询中的所有词条应以与查询中的顺序相同的顺序出现。这就是为什么,当您提供 mac 地址的前缀时,您可以匹配/搜索 mac 地址。

第二种情况,使用+ 运算符。 + 运算符要求+ 符号之后的术语存在于字段中的某处。所以现在它不依赖于术语的顺序,术语必须存在于该字段中。你不需要 dismax 插件来实现这个功能。您需要使用+ 运算符来表示must 现有术语。

其他方式可能是使用 (Edge)N-Gram 过滤器来生成不同的标记并对其进行索引。在我看来,这对你来说不是必需的。它还会增加您的索引大小。

您可能还想了解分析器在索引和查询数据时正在做什么。

数据:机器地址(00:1R:54:C8:CD:30)

<fieldType class="org.apache.solr.schema.TextField" name="TextField">
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

StandardTokenizer 标记器将文本字段拆分为标记,将空格和标点符号视为分隔符。 LowerCaseFilter 将每个标记中的字母小写。因此,当您索引数据时,它会将 mac 地址拆分为六个单独的令牌并对它们进行索引。查询阶段也是如此。


我发现,StandardTokenizer 在某些情况下不会通过拆分 mac add 的部分来创建令牌。例如CA:F0 没有分成两个标记。

请尝试以下配置:

<fieldType class="org.apache.solr.schema.TextField" name="TextField_Pattern">
    <analyzer>
        <tokenizer class="solr.PatternTokenizerFactory" pattern=":"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

这是使用PatternTokenizer 而不是StandardTokenizerPatternTokenizer 将始终通过拆分部分 mac 地址来生成令牌。

以下是部分搜索的示例。我已经获取了mac地址的替代部分并进行了搜索。

【讨论】:

  • 虽然我不明白一件事,如果我运行以下查询:display_string:(+and +MAC +65\:CA) 我得到想要的结果,但如果查询是 display_string:(+and +MAC +CA\:F0),我没有得到任何结果(MAC 地址是 F1 :65:CA:F0:00:00)。如果输入了 MAC 地址的最后两部分,则查询也有效。
  • 您可以尝试启用调试模式并运行查询。使用&amp;debugQuery=true。这将提供有关如何针对索引执行查询的详细信息。浏览器中的查询 url 并检查页面底部的调试结果。
  • 好的,这是我得到的 2 个结果,我可以看到解析后的查询有所不同.. postimg.org/image/smv4z4g5vpostimg.org/image/tqdgt8zlt ,但我传递的语法与您看到的相同!
  • 顺便说一下,我运行了一个不同的查询和一个不同的 MAC 地址。另外,文本文件中的每个单词都被 solr 标记了吗?
  • 是的,好吧,但我仍然对为什么部分 MAC 搜索不起作用感到困惑。顺便说一下,在图片/分析部分,字段索引显示文本将如何存储对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 2013-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多