Java API for mapping

classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

Java API for mapping

IvanBrusic
Perhaps I am missing something fundamental, but I cannot figure out
how to add a mapping via the Java API.  I can index and query
documents, but I do not see the relevant methods in the client
interface.  You have prepareIndex, prepareSearch, prepareBulk, etc..,
but I do not know which is applicable for mapping.

There is always the REST API, but I prefer to keep things in code for
version control purposes.  I can rollout a new version of the server
and not have to remember to update the mappings.

If I must use the REST API, can I create a mapping at the type level
(regardless of index)?

curl -XPUT 'http://localhost:9200/_all/mytype/_mapping' -d '
{
    "mytype" : {
        "properties" : {
            "value" : {"type" : "string", "store" : "yes", "index" :
"not_analyzed"}
        }
    }
}
'
Reply | Threaded
Open this post in threaded view
|

Re: Java API for mapping

IvanBrusic
BTW, I found the answer to my last question in the docs.  For those
interested, yes you can use _all.

On Nov 15, 3:21 pm, Ivan Brusic <[hidden email]> wrote:

> Perhaps I am missing something fundamental, but I cannot figure out
> how to add a mapping via the Java API.  I can index and query
> documents, but I do not see the relevant methods in the client
> interface.  You have prepareIndex, prepareSearch, prepareBulk, etc..,
> but I do not know which is applicable for mapping.
>
> There is always the REST API, but I prefer to keep things in code for
> version control purposes.  I can rollout a new version of the server
> and not have to remember to update the mappings.
>
> If I must use the REST API, can I create a mapping at the type level
> (regardless of index)?
>
> curl -XPUT 'http://localhost:9200/_all/mytype/_mapping'-d '
> {
>     "mytype" : {
>         "properties" : {
>             "value" : {"type" : "string", "store" : "yes", "index" :
> "not_analyzed"}
>         }
>     }}
>
> '
Reply | Threaded
Open this post in threaded view
|

Re: Java API for mapping

kimchy
Administrator
There is the putMapping API in the client#admin#indices.

On Mon, Nov 15, 2010 at 10:22 PM, Ivan Brusic <[hidden email]> wrote:
BTW, I found the answer to my last question in the docs.  For those
interested, yes you can use _all.

On Nov 15, 3:21 pm, Ivan Brusic <[hidden email]> wrote:
> Perhaps I am missing something fundamental, but I cannot figure out
> how to add a mapping via the Java API.  I can index and query
> documents, but I do not see the relevant methods in the client
> interface.  You have prepareIndex, prepareSearch, prepareBulk, etc..,
> but I do not know which is applicable for mapping.
>
> There is always the REST API, but I prefer to keep things in code for
> version control purposes.  I can rollout a new version of the server
> and not have to remember to update the mappings.
>
> If I must use the REST API, can I create a mapping at the type level
> (regardless of index)?
>
> curl -XPUT 'http://localhost:9200/_all/mytype/_mapping'-d '
> {
>     "mytype" : {
>         "properties" : {
>             "value" : {"type" : "string", "store" : "yes", "index" :
> "not_analyzed"}
>         }
>     }}
>
> '

Reply | Threaded
Open this post in threaded view
|

Re: Java API for mapping

IvanBrusic
Thanks for the clarification.  I was concentrating on the addMapping
call in CreateIndexRequestBuilder and I couldn't figure out how to
create a CreateIndexRequestBuilder from an IndexRequestBuilder.  Did
not scroll down to the putMapping method. :)

In the end, I found the method of using files for built-in custom
mappings.  This solution is even better since I can create my own roll
out with the mapping files included and skip the explicit put mapping
call on bootstrap.  Awesome!  However, before that I was struggling
with the REST API.  Putting a mapping to the _all index had no effect
on future indexing requests.  You cannot put a mapping on an index
that does not exist and an attempt to put a mapping after indexing
returned the error:

{"error":"Merge failed with failures {[mapper [value] has different
index values, mapper [value] has different store values, mapper
[value] has different index_analyzer, mapper [value] has different
search_analyzer]}"}

Built-in custom mappings work perfectly, but I was wondering, for
future reference, how to get around the chicken-and-the-egg problem
above?

Cheers,

Ivan

On Nov 15, 5:47 pm, Shay Banon <[hidden email]> wrote:

> There is the putMapping API in the client#admin#indices.
>
>
>
>
>
>
>
> On Mon, Nov 15, 2010 at 10:22 PM, Ivan Brusic <[hidden email]> wrote:
> > BTW, I found the answer to my last question in the docs.  For those
> > interested, yes you can use _all.
>
> > On Nov 15, 3:21 pm, Ivan Brusic <[hidden email]> wrote:
> > > Perhaps I am missing something fundamental, but I cannot figure out
> > > how to add a mapping via the Java API.  I can index and query
> > > documents, but I do not see the relevant methods in the client
> > > interface.  You have prepareIndex, prepareSearch, prepareBulk, etc..,
> > > but I do not know which is applicable for mapping.
>
> > > There is always the REST API, but I prefer to keep things in code for
> > > version control purposes.  I can rollout a new version of the server
> > > and not have to remember to update the mappings.
>
> > > If I must use the REST API, can I create a mapping at the type level
> > > (regardless of index)?
>
> > > curl -XPUT 'http://localhost:9200/_all/mytype/_mapping'-d'
> > > {
> > >     "mytype" : {
> > >         "properties" : {
> > >             "value" : {"type" : "string", "store" : "yes", "index" :
> > > "not_analyzed"}
> > >         }
> > >     }}
>
> > > '
Reply | Threaded
Open this post in threaded view
|

Re: Java API for mapping

kimchy
Administrator
In "chicken and the egg" problem you mean creating an index and put mapping to it before any indexing has been done and the sync problem around it? The first thing is to allow to provide mappings in the REST create index operation.

-shay.banon

On Tue, Nov 16, 2010 at 4:34 PM, Ivan Brusic <[hidden email]> wrote:
Thanks for the clarification.  I was concentrating on the addMapping
call in CreateIndexRequestBuilder and I couldn't figure out how to
create a CreateIndexRequestBuilder from an IndexRequestBuilder.  Did
not scroll down to the putMapping method. :)

In the end, I found the method of using files for built-in custom
mappings.  This solution is even better since I can create my own roll
out with the mapping files included and skip the explicit put mapping
call on bootstrap.  Awesome!  However, before that I was struggling
with the REST API.  Putting a mapping to the _all index had no effect
on future indexing requests.  You cannot put a mapping on an index
that does not exist and an attempt to put a mapping after indexing
returned the error:

{"error":"Merge failed with failures {[mapper [value] has different
index values, mapper [value] has different store values, mapper
[value] has different index_analyzer, mapper [value] has different
search_analyzer]}"}

Built-in custom mappings work perfectly, but I was wondering, for
future reference, how to get around the chicken-and-the-egg problem
above?

Cheers,

Ivan

On Nov 15, 5:47 pm, Shay Banon <[hidden email]> wrote:
> There is the putMapping API in the client#admin#indices.
>
>
>
>
>
>
>
> On Mon, Nov 15, 2010 at 10:22 PM, Ivan Brusic <[hidden email]> wrote:
> > BTW, I found the answer to my last question in the docs.  For those
> > interested, yes you can use _all.
>
> > On Nov 15, 3:21 pm, Ivan Brusic <[hidden email]> wrote:
> > > Perhaps I am missing something fundamental, but I cannot figure out
> > > how to add a mapping via the Java API.  I can index and query
> > > documents, but I do not see the relevant methods in the client
> > > interface.  You have prepareIndex, prepareSearch, prepareBulk, etc..,
> > > but I do not know which is applicable for mapping.
>
> > > There is always the REST API, but I prefer to keep things in code for
> > > version control purposes.  I can rollout a new version of the server
> > > and not have to remember to update the mappings.
>
> > > If I must use the REST API, can I create a mapping at the type level
> > > (regardless of index)?
>
> > > curl -XPUT 'http://localhost:9200/_all/mytype/_mapping'-d'
> > > {
> > >     "mytype" : {
> > >         "properties" : {
> > >             "value" : {"type" : "string", "store" : "yes", "index" :
> > > "not_analyzed"}
> > >         }
> > >     }}
>
> > > '

Reply | Threaded
Open this post in threaded view
|

Re: Java API for mapping

John Chang
In reply to this post by kimchy
Is there a java api for getting the mappings?  Something like a java api that does this:
http://www.elasticsearch.com/docs/elasticsearch/rest_api/admin/indices/get_mapping/

I want to have my service start up and query the mappings; if they are not as expected, I want the service to log errors and shutdown.  We've had problems with services coming up and they are not running against the mappings they thought they had.

If what I am looking for does not exist, could you give any other advice on how to sanity check the mappings upon application startup?  Or perhaps other programming/operational tips on making sure the correct mappings are in place?

Thanks.
Reply | Threaded
Open this post in threaded view
|

Re: Java API for mapping

kimchy
Administrator

All the REST APIs use the Java APIs internally. The get mapping is simply using the cluster state API, to get the relevant index information, which also has the mappings there.

On Tuesday, December 7, 2010 at 11:37 PM, John Chang wrote:


Is there a java api for getting the mappings? Something like a java api that
does this:
http://www.elasticsearch.com/docs/elasticsearch/rest_api/admin/indices/get_mapping/

I want to have my service start up and query the mappings; if they are not
as expected, I want the service to log errors and shutdown. We've had
problems with services coming up and they are not running against the
mappings they thought they had.

If what I am looking for does not exist, could you give any other advice on
how to sanity check the mappings upon application startup? Or perhaps other
programming/operational tips on making sure the correct mappings are in
place?

Thanks.
--
View this message in context: http://elasticsearch-users.115913.n3.nabble.com/Java-API-for-mapping-tp1906936p2036369.html
Sent from the ElasticSearch Users mailing list archive at Nabble.com.

Reply | Threaded
Open this post in threaded view
|

Re: Java API for mapping

samCougars
In reply to this post by IvanBrusic
I'm trying to add a mapping for sorting while creating index.
I'm indexing on two fields title and abbreviation. When I do a search I want to sort the result on title or abbreviation. Both the fields can have multi text values like title can "Harry Potter And Adventures" or abbreviation can be "HP AD And War".  
While during search, if I only add sort as (searchRequestBuilder.addSort("title",SearchOrder.ASC))  then it gave me an error saying that "Can't sort on string types with more than one value per doc, or more than one token per field". I know I'm getting this error because my indexed field "title" is "not_analyzed".  I'm creating index as
client.prepareIndex("elasticSearch", "myFields", "1000").setSource(myContentBuilder()).execute().actionGet().

And myContentBuilder() creates a XcontentBuilder like
XContentBuilder myContentBuilder()
{
Map myValues = new HashMap();
myValues.put("title","Harry Potter And Adventures");

myValues.put("abbreviation", "HP AD And War");
    XContentBuilder builder = XContentFactory.jsonBuilder().startObject().startObject("title").field("index", "not_analyzed").field("type", "string").endObject().endObject();
return builder.map(myValues);
}

I think there is some issues w/ my XConterBuilder ("  XContentBuilder builder = XContentFactory.jsonBuilder().startObject().startObject("title").field("index", "not_analyzed").field("type", "string").endObject().endObject()") but I can't think of any issue on it. It does not throw an error while creating an index but when I do a search it still throws "Can't sort on string types with more than one value per doc, or more than one token per field".
Can anyone think of the issue while I'm creating builder to add as a mapping to achieve sorting on title?