123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- [[index_]]
- == Index API
- The index API allows one to index a typed JSON document into a specific
- index and make it searchable.
- [[generate]]
- === Generate JSON document
- There are different way of generating a JSON document:
- * Manually (aka do it yourself) using native `byte[]` or as a `String`
- * Using a `Map` that will be automatically converted to its JSON
- equivalent
- * Using a third party library to serialize your beans such as
- http://wiki.fasterxml.com/JacksonHome[Jackson]
- * Using built-in helpers XContentFactory.jsonBuilder()
- Internally, each type is converted to `byte[]` (so a String is converted
- to a `byte[]`). Therefore, if the object is in this form already, then
- use it. The `jsonBuilder` is highly optimized JSON generator that
- directly constructs a `byte[]`.
- ==== Do It Yourself
- Nothing really difficult here but note that you will have to encode
- dates according to the
- {ref}/mapping-date-format.html[Date Format].
- [source,java]
- --------------------------------------------------
- String json = "{" +
- "\"user\":\"kimchy\"," +
- "\"postDate\":\"2013-01-30\"," +
- "\"message\":\"trying out Elasticsearch\"" +
- "}";
- --------------------------------------------------
- [[using-map]]
- ==== Using Map
- Map is a key:values pair collection. It represents very well a JSON
- structure:
- [source,java]
- --------------------------------------------------
- Map<String, Object> json = new HashMap<String, Object>();
- json.put("user","kimchy");
- json.put("postDate",new Date());
- json.put("message","trying out Elasticsearch");
- --------------------------------------------------
- [[beans]]
- ==== Serialize your beans
- Elasticsearch already uses Jackson but shades it under
- `org.elasticsearch.common.jackson` package. +
- So, you can add your own Jackson version in your `pom.xml` file or in
- your classpath. See http://wiki.fasterxml.com/JacksonDownload[Jackson
- Download Page].
- For example:
- [source,xml]
- --------------------------------------------------
- <dependency>
- <groupId>com.fasterxml.jackson.core</groupId>
- <artifactId>jackson-databind</artifactId>
- <version>2.1.3</version>
- </dependency>
- --------------------------------------------------
- Then, you can start serializing your beans to JSON:
- [source,java]
- --------------------------------------------------
- import com.fasterxml.jackson.databind.*;
- // instance a json mapper
- ObjectMapper mapper = new ObjectMapper(); // create once, reuse
- // generate json
- String json = mapper.writeValueAsString(yourbeaninstance);
- --------------------------------------------------
- [[helpers]]
- ==== Use Elasticsearch helpers
- Elasticsearch provides built-in helpers to generate JSON content.
- [source,java]
- --------------------------------------------------
- import static org.elasticsearch.common.xcontent.XContentFactory.*;
- XContentBuilder builder = jsonBuilder()
- .startObject()
- .field("user", "kimchy")
- .field("postDate", new Date())
- .field("message", "trying out Elasticsearch")
- .endObject()
- --------------------------------------------------
- Note that you can also add arrays with `startArray(String)` and
- `endArray()` methods. By the way, the `field` method +
- accepts many object types. You can directly pass numbers, dates and even
- other XContentBuilder objects.
- If you need to see the generated JSON content, you can use the
- `string()` method.
- [source,java]
- --------------------------------------------------
- String json = builder.string();
- --------------------------------------------------
- [[index-doc]]
- === Index document
- The following example indexes a JSON document into an index called
- twitter, under a type called tweet, with id valued 1:
- [source,java]
- --------------------------------------------------
- import static org.elasticsearch.common.xcontent.XContentFactory.*;
- IndexResponse response = client.prepareIndex("twitter", "tweet", "1")
- .setSource(jsonBuilder()
- .startObject()
- .field("user", "kimchy")
- .field("postDate", new Date())
- .field("message", "trying out Elasticsearch")
- .endObject()
- )
- .execute()
- .actionGet();
- --------------------------------------------------
- Note that you can also index your documents as JSON String and that you
- don't have to give an ID:
- [source,java]
- --------------------------------------------------
- String json = "{" +
- "\"user\":\"kimchy\"," +
- "\"postDate\":\"2013-01-30\"," +
- "\"message\":\"trying out Elasticsearch\"" +
- "}";
- IndexResponse response = client.prepareIndex("twitter", "tweet")
- .setSource(json)
- .execute()
- .actionGet();
- --------------------------------------------------
- `IndexResponse` object will give you a report:
- [source,java]
- --------------------------------------------------
- // Index name
- String _index = response.getIndex();
- // Type name
- String _type = response.getType();
- // Document ID (generated or not)
- String _id = response.getId();
- // Version (if it's the first time you index this document, you will get: 1)
- long _version = response.getVersion();
- --------------------------------------------------
- If you use percolation while indexing, `IndexResponse` object will give
- you a percolator that have matched:
- [source,java]
- --------------------------------------------------
- IndexResponse response = client.prepareIndex("twitter", "tweet", "1")
- .setSource(json)
- .execute()
- .actionGet();
- List<String> matches = response.matches();
- --------------------------------------------------
- For more information on the index operation, check out the REST
- {ref}/docs-index_.html[index] docs.
- === Operation Threading
- The index API allows one to set the threading model the operation will be
- performed when the actual execution of the API is performed on the same
- node (the API is executed on a shard that is allocated on the same
- server).
- The options are to execute the operation on a different thread, or to
- execute it on the calling thread (note that the API is still asynchronous). By
- default, `operationThreaded` is set to `true` which means the operation
- is executed on a different thread.
|