简体   繁体   中英

Solr schema field

I've made a schema for solr and I don't know the name of every field from the document I want to add, so I defined a dynamicField like this:

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

Right now I'm testing and I don't get an error when importing for undefined fields in the document, but when I try to query for *:something (anything other than "*") I don't get any results back. My question is how can I define a catch all field, is there any right way to do this? Or am I under the wrong impression that a query for *:something would normally search in all the documents and all the fields for "something"?

The search key word `*:something` can not get anything from solr, no matter what kind of field you are using, dinamicField or not.

If I understand your question correctly, you want a dynamicField to store all fields and want to query all fields laterly.

Here is my solution.

First, defining a default_search field for search:

<field name="default_search" type="text" indexed="true" stored="true" multiValued="true"/>

And then copy all fields into the default_search field.

<copyField source="*" dest="default_search" />

Finally, you can make a query for all fields like this:

http://host/core/select/?q=something

or

http://host/core/select/?q=default_search:something

AFAIK *:something does not query all the fields. It looks for a field names * .

I get the below error when attempting to do a query for *: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>

You would need to define a catchall field using copyField in your schema.xml .

I would recommend not using a simple wildcard for dynamic fields. Instead something like this:

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

and then have a catchall field

<field name="CatchAll" type="text_general" indexed="true" stored="true" multiValued="false" />

You can have a copyField defined as below, to support query such as q=something

<copyField source="*_text" dest="CatchAll" />

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM