如何在solr中进行复杂短语关键字搜索

如何在solr中进行复杂短语关键字搜索,solr,solr4,Solr,Solr4,有人能告诉我如何在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”,即使我逃出分号,上面的命令也不起作用,我也尝试传递通配符,但它们也不起作用 还有,这是

有人能告诉我如何在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'参数指定默认值”

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

编辑:如果我使用Demax插件将查询分解为
(+和+MAC+65 \:CA)
,它就可以工作了,但是Lucene query没有其他方法可以做到这一点吗

以下是核心的模式:

<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>...

...

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

display\u string
是否命中取决于字段display\u string的定义及其处理方式。如果它是一个
字符串
(StrField),您将无法命中该字段中的任何内容。如果它是
text\u general
(这是示例配置中提供的默认类型之一),“down”和“new”应该至少提供命中率,而“65:CA”也应该可以工作,尽管根据字段的处理方式可能会有所不同

错误消息
查询中未指定字段名,也未通过'df'参数指定默认值
的意思正是-查询中未包含字段名,Solr不知道默认情况下搜索哪个字段,因为也没有提供
df
参数
foo:bar
foo
字段中搜索值
bar
,但是如果您只提供
bar
,Solr不知道要搜索哪个字段,除非
df
存在(或者配置中的defaultSearchField,这是以前的做法)


如果使用(e)dismax查询解析器,还可以使用
qf
参数一次搜索多个字段,并在不同字段之间包含权重<代码> qf= DePaseScript字符串MACADDR 将同时搜索<代码> DISPLAYSHIGH 和<代码> MADADDR

当您在术语查询中使用<代码>双引号时,将其视为短语,并且查询中的所有术语都应按照查询中的相同顺序呈现。这就是为什么在提供mac地址前缀时,您可以匹配/搜索mac地址

第二种情况,使用
+
运算符。
+
运算符要求
+
符号后面的术语存在于字段中的某个位置。所以现在它不依赖于项的顺序,项必须存在于字段中。您不需要使用Demax插件来实现此功能。您需要使用
+
运算符来表示
必须
的术语

另一种方法是使用(边缘)N-Gram过滤器来生成不同的令牌并对它们进行索引。在我看来,你不需要这样做。它还将增加索引大小

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

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

这是使用
PatternTokenizer
而不是
StandardTokenizer
PatternTokenizer
总是通过分割mac地址的部分来生成令牌。

下面是一个部分搜索的示例。我已经取得了mac地址的备用部分并进行了搜索。

display\u string:+down+new“65:CA”~
起作用,但当我使用时间戳递减选项进行排序时,它也会显示没有mac地址65:CA的值。这就是您所说的“while'65:CA'也应该起作用-尽管根据字段的处理方式可能会有所不同”?solr服务器界面上的Demax插件似乎运行得很好,如何将其作为查询写入?只需使用
defType=Demax
或者,根据使用的库,在此处设置查询处理器/类型。应该有很好的文档记录。嗯,是的,我看到了,但我又遇到了另一个问题,Demax在界面上似乎工作得很好;在界面上的qf字段中,我使用了id:4和gr_id:(0 1 2)并显示字符串,在q字段中,我键入了
+down+new+0f\:cd
,这给了我正确的结果,但我想构造一个solr查询,因为我在datastax/cassandra上使用了solr。因此,当我使用
{!defType=dismax mm=100%}id:4和gr_id:(0 1 2)并显示字符串:(+down+new+0f \:cd)
作为查询时,我在接口上没有得到任何结果。qf字段应该有字段名,而不是查询。使用debugQuery查看查询的解析方式,删除部分以查看匹配停止的位置,如果要在每个字段中搜索以fieldname为前缀的值,则可能不需要Demax。能否提供用于索引和查询阶段的FieldType声明?这里是
,我不明白您所说的查询阶段是什么意思?我没有为查询阶段传递任何字段类型参数。您能提供display\u string的定义吗?display\u string是文本类型的cassandra键空间中的一列…这是您想要知道的吗?我正在和solr合作卡桑德拉/dse..不。您的
schema.xml
应该有一个FieldType标记声明,用于定义标记器和一组过滤器,以便在索引之前处理此字段。例如:text_general是一个使用
StandardTokenizerFactory
和一些StopwordFilter的工具。但是,如果我运行以下查询,我不理解一件事:
display_string:(+和+MAC+65 \:CA)
我会得到所需的结果,但是如果查询是
di
<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.TextField" name="TextField_Pattern">
    <analyzer>
        <tokenizer class="solr.PatternTokenizerFactory" pattern=":"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>