Indexing SOLR不在某些字段上搜索
刚刚安装了Solr,编辑了Indexing SOLR不在某些字段上搜索,indexing,solr,Indexing,Solr,刚刚安装了Solr,编辑了schema.xml,现在我正在尝试对其进行索引,并使用一些测试数据对其进行搜索 在我要发送给Solr的XML文件中,我的一个字段如下所示: <field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field> <field name="PageContent" type="text" indexed="true
schema.xml
,现在我正在尝试对其进行索引,并使用一些测试数据对其进行搜索
在我要发送给Solr的XML文件中,我的一个字段如下所示:
<field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field>
<field name="PageContent" type="text" indexed="true" stored="true"/>
当我运行发布工具时,一切正常,但是当我搜索PageContent
字段中的内容时,我没有得到任何结果
但是,当我将
节点设置为PageContent
时,它可以工作。但如果我将其设置为任何其他字段,它不会在PageContent
中搜索
我做错什么了吗?有什么问题吗
要澄清错误,请执行以下操作: 我上传了一份包含以下数据的“文档”:
<field name="PageID">928</field>
<field name="PageName">some name</field>
<field name="PageContent"><![CDATA[<p>html content</p>]]></field>
928
某个名字
html内容]>
在我的模式中,我定义了如下字段:
<field name="PageID" type="integer" indexed="true" stored="true" required="true"/>
<field name="PageName" type="text" indexed="true" stored="true"/>
<field name="PageContent" type="text" indexed="true" stored="true"/>
以及:
PageID
页码
现在,当我使用Solr管理工具并搜索“somename
”时,我得到了一个结果。但是,如果我搜索“html内容”
”、“html
”、“content
”或“928
”,则不会得到任何结果
为什么?在尝试搜索数据之前,您要确保您的数据已提交,对吗 此外,如果您想存储原始HTML,最好实际删除HTML。您可以在应用程序中或使用Solr的Solr.HTMLStripWhitespaceTokenizerFactory执行此操作,如:
<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/>
在“文本”的字段类型定义中声明。您可能只想为html创建一个新的字段类型,例如text_html,您可以这样使用它:
<fieldtype name="text_html" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory" ignoreCase="true"/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/>
<filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
</analyzer>
</fieldtype>
我不知道你说的是什么意思:
但是,当我将节点设置为
页面内容,它工作。但如果我定下来的话
对于任何其他字段,它都不会搜索
在页面内容中
您能详细说明一下吗?您提到您的默认搜索字段设置为PageName,我不希望搜索“内容”会返回任何内容 您可能打算将“PageContent:content”放在搜索框中以查找该字段中的数据。如果你想搜索多个字段,你会想签出它。solr管理控制台并不是一个很好的工具来处理所有的Demax搜索选项,您只需要操纵URL即可 无论如何,我同意前面的海报,如果你的分析设置没有正确设置来处理HTML,你很可能会得到各种意想不到的搜索结果。去掉HTML并仅索引文本 如果希望标准查询处理程序针对所有字段进行搜索,可以在solrconfig.xml中对其进行更改(我总是添加第二个查询处理程序,而不是修改“标准”)。qf字段是要搜索的字段列表。它是一个以空格分隔的列表
<requestHandler name="standard" class="solr.DisMaxRequestHandler">
<lst name="defaults">
<str name="echoParams">all</str>
<str name="hl">true</str>
<str name="fl">*</str>
<str name="qf">PageName PageContent</str>
</lst>
</requestHandler>
全部的
真的
*
页面名称页面内容
fl
是查询返回的字段列表。qf
是您想要参考的列表,它不支持通配符
搜索所有字段而不登记它们的唯一方法是使用一个copyField来捕获所有值(不仅仅存储在索引中),然后通过在my schema.xml中搜索来模拟对所有字段的搜索。我有如下内容,它将以_t结尾的每个字段的值复制到文本字段中
<defaultSearchField>text</defaultSearchField>
<copyField source="*_t" dest="text" maxChars="3000"/>
文本
参数fl
没有指定要查询的字段,而是指定要在响应中返回的字段
您只需添加到schema.xml
:
<field name="fieldContainingEverything" type="text" indexed="true" stored="true" multiValued="true" />
<defaultSearchField>fieldContainingEverything</defaultSearchField>
<copyField source="*" dest="fieldContainingEverything" maxChars="3000"/>
到您的
schema.xml
。现在,当您使用hl.true&hl.fl=*
通过dismax查询Solr时,您将qf=fieldContainingEverything^1
添加到参数列表中。Solr现在搜索每个索引字段,但也会突出显示包含查询项的每个字段。这种方法的缺点显然是索引大小增加了在大多数情况下,我认为这不应该是那么重要。cool cody,上面的代码真的很有用,我一定会去掉html。至于页面内容问题,我已经更新了上面的问题。非常感谢。很酷,谢谢Trey。让我直说吧。我有点困惑。所以,如果我只是发送一个搜索查询,即。“solr/?q=嗨,我住在内容节点中"SOLR将只对单个字段进行查找?当我运行示例vanilla SOLR安装程序时,我感觉像是一个简单的查询搜索所有字段?我错了吗?因为注释中没有语法突出显示,我在上面用一个建议进行了澄清。如下所述,fl是要返回的字段列表,而不是搜索的字段。-他们说标准SOLR查询解析器很愚蠢,选择Demax解析器:)开源项目通常有不好的默认值……无论出于何种原因,在qf字段中显式添加字段允许我进行搜索(当然是在重新导入之后)。所以谢谢你。我很惊讶他们没有在字段上搜索,因为我将索引的
属性标记为TRUE,而且据我所知,我没有指定默认的搜索字段。
<field name="fieldContainingEverything" type="text" indexed="true" stored="true" multiValued="true" />
<defaultSearchField>fieldContainingEverything</defaultSearchField>
<copyField source="*" dest="fieldContainingEverything" maxChars="3000"/>
<dynamicField name="*" type="string" indexed="true" stored="true"/>