如何在solr

时间:2015-08-19 06:52:28

标签: solr solr4

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

display_string:"and MAC F1:65"

但是如果想只搜索一部分MAC地址,假设我的查询是“和MAC 65:CA”,即使我逃过分号,上面的命令也不起作用,我也试过通过外卡,但是他们也不工作。

此外,这是什么意思:

  

“msg”:“查询中未指定字段名称,并且未通过'df'param指定默认值”

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

编辑:如果我使用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>...

2 个答案:

答案 0 :(得分:2)

由于您有两个不同的问题:

display_string命中是否取决于字段display_string的定义,以及它是如何处理的。如果它是string(StrField),那么您根本无法击中该字段中的任何内容。如果它是text_general(这是示例配置中提供的默认类型之一),则&#39; down&#39;和&#39;新&#39;应该至少给出点击,而&#39; 65:CA&#39;也应该工作 - 尽管这里可能存在差异,这取决于如何处理字段。

错误消息no field name specified in query and no default specified via 'df' param意味着 - 您没有在查询中包含字段名称,而且Solr默认不知道要搜索的字段,因为那里有也没有提供df参数。 foo:bar在字段bar中搜索值foo,但如果您只提供bar,则Solr不知道要搜索的字段,除非{{1}存在(或配置中的defaultSearchField,这是旧方法)。

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

答案 1 :(得分:1)

在术语查询中使用double quotes时,它会将其视为短语,并且查询中的所有术语应按查询中的顺序排列。这就是为什么,当你提供mac地址的前缀时,你能够匹配/搜索mac地址。

第二种情况,使用+运算符。 +运算符要求+符号后面的术语存在于字段中的某个位置。所以现在它不依赖于术语的顺序,术语必须存在于该领域。你不需要dismax插件来实现这个功能。您需要将+运算符用于must当前条款。

其他方式可能是使用(Edge)N-Gram Filter生成不同的令牌并为其编制索引。在我看来,这不是你所必需的。它还会增加您的索引大小。

您还可能希望在索引和查询数据时了解分析器正在执行的操作。

数据:机器地址(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地址拆分为六个单独的令牌并对其进行索引。查询阶段也是如此。 enter image description here

我发现,StandardTokenizer在某些情况下不会通过拆分mac add的部分来创建令牌。例如CA:F0不会分为两个令牌。 enter image description here

请尝试使用以下配置:

<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地址来生成令牌。 enter image description here

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