刚刚安装了Solr,编辑了schema.xml
,现在我正在尝试对其进行索引并使用一些测试数据对其进行搜索。
在我发送给Solr的XML文件中,我的一个字段看起来像这样:
<field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field>
那里有HTML,所以我把它包装在CDATA中。
在我的Solr schema.xml
中,该字段的定义如下:
<field name="PageContent" type="text" indexed="true" stored="true"/>
当我运行POSTing工具时,一切正常,但当我搜索我知道的内容在PageContent
字段内时,我没有得到任何结果。
但是,当我将<defaultSearchField>
节点设置为PageContent
时,它可以正常工作。但是,如果我将其设置为任何其他字段,则不会在PageContent
中搜索。
我做错了吗?这是什么问题?
澄清错误:
我上传了一份包含以下数据的“doc”:
<field name="PageID">928</field>
<field name="PageName">some name</field>
<field name="PageContent"><![CDATA[<p>html content</p>]]></field>
在我的架构中,我已经定义了这样的字段:
<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"/>
和
<uniqueKey>PageID</uniqueKey>
<defaultSearchField>PageName</defaultSearchField>
现在,当我使用Solr管理工具并搜索“some name
”时,我得到了一个结果。但是,如果我搜索“html content
”,“html
”,“content
”或“928
”,则无法获得结果
为什么?
答案 0 :(得分:7)
您提到您的默认搜索字段设置为PageName,我不希望搜索“内容”返回任何内容。
您可能打算在搜索框中输入“PageContent:content”来查找该字段中的数据。如果您要搜索多个字段,则需要查看http://wiki.apache.org/solr/DisMaxRequestHandler。 solr管理控制台不是一个可以使用所有DisMax搜索选项的工具,你只想操纵它的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>
答案 1 :(得分:1)
您确定在尝试搜索数据之前已经提交了数据,对吗?
此外,如果您想存储原始HTML,最好实际删除HTML。您可以在您的应用程序中或使用Solr的solr.HTMLStripWhitespaceTokenizerFactory执行此操作,如:
<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/>
您在“text”字段定义中声明的内容。你可能想为你的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>
我不确定你的意思是:
但是,当我将节点设置为 PageContent,它的工作原理。但是,如果我设置它 到任何其他领域,它不搜索 在PageContent。
你能详细说明吗?
答案 2 :(得分:1)
fl
是查询返回的字段列表。qf
是您要引用的列表,它不支持通配符..
在不登记所有字段的情况下搜索所有字段的唯一方法是使用copyField捕获所有值(不是仅存储索引),然后通过搜索来模拟搜索所有字段
答案 3 :(得分:0)
在我的schema.xml中,我有类似下面的内容,它将以_t结尾的每个字段的值复制到文本字段中。
<defaultSearchField>text</defaultSearchField>
<copyField source="*_t" dest="text" maxChars="3000"/>
答案 4 :(得分:0)
参数fl
执行不指定要查询的字段,但指定要在响应中返回的字段。
您只需添加到schema.xml
:
<field name="fieldContainingEverything" type="text" indexed="true" stored="true" multiValued="true" />
<defaultSearchField>fieldContainingEverything</defaultSearchField>
<copyField source="*" dest="fieldContainingEverything" maxChars="3000"/>
现在,在建立索引时,每个字段都会复制到fieldContainingEverything
。 此处的问题是您忘记了内容来自的字段,如果您想进一步评估该信息。如果有人对此有所了解,我会很高兴。
我发现了一个有点功能性的解决方案:
使用更多细节来描述场景:我有一个MySQL数据库表,其中包含许多要索引的字段,只需导入每个字段而不指定每个字段(SELECT * FROM
...)。我想针对表的每个字段查询索引,并想知道哪个字段与查询匹配。这不是开箱即用的,因为荧光笔只是告诉您匹配查询的字段是fieldContainingEverything
。通过使用 dismax 查询处理程序,我发现即使据说在每个字段中进行搜索,我似乎也无法搜索qf
参数中未指定的字段。现在的想法是通过添加:
<dynamicField name="*" type="string" indexed="true" stored="true"/>
到schema.xml
。现在,当您使用hl.true&hl.fl=*
通过 dismax 查询Solr时,将qf=fieldContainingEverything^1
添加到参数列表中。 Solr现在搜索每个索引字段,但也会突出显示包含查询字词的每个字段。这种方法的缺点显然是增加的指数大小,在我认为的大多数情况下不应该是相关的。