Solr架构字段

时间:2013-08-14 07:38:55

标签: solr

我为solr制作了一个模式,我不知道我要添加的文档中每个字段的名称,所以我定义了一个像这样的dynamicField:

<dynamicField name="*" type="text_general" indexed="true" stored="true" />

现在我正在测试,在导入文档中的未定义字段时我没有收到错误,但是当我尝试查询*:something(“*”以外的任何内容时)我没有得到任何结果。 我的问题是如何定义一个catch all字段,有没有正确的方法来做到这一点?或者我错误地认为*:something的查询通常会在所有文档和所有字段中搜索“某事”?

2 个答案:

答案 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" />