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)?
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)?
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)?
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?
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)?
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.
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?
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)?
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?
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:
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?
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?
Apache, Apache Lucene, Apache Hadoop, Hadoop, HDFS and the yellow elephant
logo are trademarks of the
Apache Software Foundation
in the United States and/or other countries.