我为solr制作了一个模式,我不知道我要添加的文档中每个字段的名称,所以我定义了一个像这样的dynamicField:
<dynamicField name="*" type="text_general" indexed="true" stored="true" />
现在我正在测试,在导入文档中的未定义字段时我没有收到错误,但是当我尝试查询*:something
(“*”以外的任何内容时)我没有得到任何结果。
我的问题是如何定义一个catch all字段,有没有正确的方法来做到这一点?或者我错误地认为*:something
的查询通常会在所有文档和所有字段中搜索“某事”?
答案 0 :(得分:1)
搜索关键字“*:something”无法从solr获取任何内容,无论您使用何种类型的字段,dinamicField与否。
如果我正确理解您的问题,您希望dynamicField存储所有字段,并希望稍后查询所有字段。
这是我的解决方案。
首先,为搜索定义default_search字段:
<field name="default_search" type="text" indexed="true" stored="true" multiValued="true"/>
然后将所有字段复制到default_search字段。
<copyField source="*" dest="default_search" />
最后,您可以对所有字段进行查询:
http://host/core/select/?q=something
或
http://host/core/select/?q=default_search:something
答案 1 :(得分:1)
AFAIK *:something
不会查询所有字段。它会查找字段名称*
。
尝试对*:test
<response>
<lst name="responseHeader">
<int name="status">400</int>
<int name="QTime">9</int>
<lst name="params">
<str name="wt">xml</str>
<str name="q">*:test</str>
</lst>
</lst>
<lst name="error">
<str name="msg">undefined field *</str>
<int name="code">400</int>
</lst>
</response>
您需要在copyField
中使用schema.xml
定义一个catchall字段。
我建议不要在动态字段中使用简单的通配符。取而代之的是:
<dynamicField name="*_text" type="text_general" indexed="true" stored="true" />
然后有一个catchall字段
<field name="CatchAll" type="text_general" indexed="true" stored="true" multiValued="false" />
您可以在下面定义copyField
,以支持q=something
等查询
<copyField source="*_text" dest="CatchAll" />