有人可以告诉我如何在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>...
答案 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 macaddr
和display_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地址拆分为六个单独的令牌并对其进行索引。查询阶段也是如此。
我发现,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
而不是StandardTokenizer
。 PatternTokenizer
将始终通过拆分部分mac地址来生成令牌。