2014-01-13 16:31:14 -05:00
|
|
|
Mapper Attachments Type for Elasticsearch
|
2013-08-20 10:03:31 -04:00
|
|
|
=========================================
|
2011-12-05 07:05:14 -05:00
|
|
|
|
2014-01-13 16:31:14 -05:00
|
|
|
The mapper attachments plugin adds the `attachment` type to Elasticsearch using [Apache Tika](http://lucene.apache.org/tika/).
|
2014-08-18 06:26:58 -04:00
|
|
|
The `attachment` type allows to index different "attachment" type field (encoded as `base64`), for example,
|
|
|
|
microsoft office formats, open document formats, ePub, HTML, and so on (full list can be found [here](http://tika.apache.org/1.5/formats.html)).
|
2011-12-05 07:05:14 -05:00
|
|
|
|
2014-08-18 06:26:58 -04:00
|
|
|
In order to install the plugin, run:
|
2014-03-19 18:04:09 -04:00
|
|
|
|
2014-08-18 06:26:58 -04:00
|
|
|
```sh
|
2014-11-05 14:38:24 -05:00
|
|
|
bin/plugin -install elasticsearch/elasticsearch-mapper-attachments/2.4.1
|
2014-08-18 06:26:58 -04:00
|
|
|
```
|
2014-03-19 18:04:09 -04:00
|
|
|
|
2014-08-18 06:26:58 -04:00
|
|
|
You need to install a version matching your Elasticsearch version:
|
2013-08-20 10:15:18 -04:00
|
|
|
|
2014-08-18 06:26:58 -04:00
|
|
|
| Elasticsearch | Attachments Plugin| Docs |
|
|
|
|
|------------------------|-------------------|------------------------------------------------------------------------------------------------------------------------------------|
|
|
|
|
| master | Build from source | See below |
|
2014-09-12 10:08:59 -04:00
|
|
|
| es-1.x | Build from source | [2.5.0-SNAPSHOT](https://github.com/elasticsearch/elasticsearch-mapper-attachments/tree/es-1.x/#version-250-snapshot-for-elasticsearch-1x)|
|
2014-11-05 14:38:24 -05:00
|
|
|
| es-1.4 | 2.4.1 | [2.4.1](https://github.com/elasticsearch/elasticsearch-mapper-attachments/tree/v2.4.1/#version-241-for-elasticsearch-14) |
|
2014-09-01 03:53:26 -04:00
|
|
|
| es-1.3 | 2.3.2 | [2.3.2](https://github.com/elasticsearch/elasticsearch-mapper-attachments/tree/v2.3.2/#version-232-for-elasticsearch-13) |
|
2014-08-18 15:39:31 -04:00
|
|
|
| es-1.2 | 2.2.1 | [2.2.1](https://github.com/elasticsearch/elasticsearch-mapper-attachments/tree/v2.2.1/#version-221-for-elasticsearch-12) |
|
2014-08-18 06:26:58 -04:00
|
|
|
| es-1.1 | 2.0.0 | [2.0.0](https://github.com/elasticsearch/elasticsearch-mapper-attachments/tree/v2.0.0/#mapper-attachments-type-for-elasticsearch) |
|
|
|
|
| es-1.0 | 2.0.0 | [2.0.0](https://github.com/elasticsearch/elasticsearch-mapper-attachments/tree/v2.0.0/#mapper-attachments-type-for-elasticsearch) |
|
|
|
|
| es-0.90 | 1.9.0 | [1.9.0](https://github.com/elasticsearch/elasticsearch-mapper-attachments/tree/v1.9.0/#mapper-attachments-type-for-elasticsearch) |
|
2014-03-28 12:47:38 -04:00
|
|
|
|
2014-08-18 06:26:58 -04:00
|
|
|
To build a `SNAPSHOT` version, you need to build it with Maven:
|
2013-08-20 10:15:18 -04:00
|
|
|
|
2014-08-18 06:26:58 -04:00
|
|
|
```bash
|
|
|
|
mvn clean install
|
|
|
|
plugin --install mapper-attachments \
|
|
|
|
--url file:target/releases/elasticsearch-mapper-attachments-X.X.X-SNAPSHOT.zip
|
|
|
|
```
|
2012-03-04 04:59:22 -05:00
|
|
|
|
2014-08-18 06:26:58 -04:00
|
|
|
Using mapper attachments
|
|
|
|
------------------------
|
2012-03-04 04:59:22 -05:00
|
|
|
|
|
|
|
Using the attachment type is simple, in your mapping JSON, simply set a certain JSON element as attachment, for example:
|
|
|
|
|
2013-08-20 10:03:31 -04:00
|
|
|
```javascript
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
PUT /test/person/_mapping
|
2013-08-20 10:03:31 -04:00
|
|
|
{
|
|
|
|
"person" : {
|
|
|
|
"properties" : {
|
|
|
|
"my_attachment" : { "type" : "attachment" }
|
2012-03-04 04:59:22 -05:00
|
|
|
}
|
|
|
|
}
|
2013-08-20 10:03:31 -04:00
|
|
|
}
|
|
|
|
```
|
2012-03-04 04:59:22 -05:00
|
|
|
|
|
|
|
In this case, the JSON to index can be:
|
|
|
|
|
2013-08-20 10:03:31 -04:00
|
|
|
```javascript
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
PUT /test/person/1
|
2013-08-20 10:03:31 -04:00
|
|
|
{
|
|
|
|
"my_attachment" : "... base64 encoded attachment ..."
|
|
|
|
}
|
|
|
|
```
|
2012-03-04 04:59:22 -05:00
|
|
|
|
2014-06-03 04:09:21 -04:00
|
|
|
Or it is possible to use more elaborated JSON if content type, resource name or language need to be set explicitly:
|
2012-03-04 04:59:22 -05:00
|
|
|
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
```
|
|
|
|
PUT /test/person/1
|
2013-08-20 10:03:31 -04:00
|
|
|
{
|
|
|
|
"my_attachment" : {
|
|
|
|
"_content_type" : "application/pdf",
|
|
|
|
"_name" : "resource/name/of/my.pdf",
|
2014-06-03 04:09:21 -04:00
|
|
|
"_language" : "en",
|
2014-07-25 11:53:19 -04:00
|
|
|
"_content" : "... base64 encoded attachment ..."
|
2012-03-04 04:59:22 -05:00
|
|
|
}
|
2013-08-20 10:03:31 -04:00
|
|
|
}
|
|
|
|
```
|
|
|
|
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
The `attachment` type not only indexes the content of the doc, but also automatically adds meta data on the attachment
|
|
|
|
as well (when available).
|
2013-08-20 10:03:31 -04:00
|
|
|
|
|
|
|
The metadata supported are:
|
|
|
|
|
|
|
|
* `date`
|
|
|
|
* `title`
|
|
|
|
* `name` only available if you set `_name` see above
|
|
|
|
* `author`
|
|
|
|
* `keywords`
|
|
|
|
* `content_type`
|
|
|
|
* `content_length` is the original content_length before text extraction (aka file size)
|
2013-10-24 05:52:51 -04:00
|
|
|
* `language`
|
2012-03-04 04:59:22 -05:00
|
|
|
|
2013-08-20 10:03:31 -04:00
|
|
|
They can be queried using the "dot notation", for example: `my_attachment.author`.
|
2012-03-04 04:59:22 -05:00
|
|
|
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
Both the meta data and the actual content are simple core type mappers (string, date, ...), thus, they can be controlled
|
|
|
|
in the mappings. For example:
|
2012-03-04 04:59:22 -05:00
|
|
|
|
2013-08-20 10:03:31 -04:00
|
|
|
```javascript
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
PUT /test/person/_mapping
|
2013-08-20 10:03:31 -04:00
|
|
|
{
|
|
|
|
"person" : {
|
|
|
|
"properties" : {
|
|
|
|
"file" : {
|
|
|
|
"type" : "attachment",
|
|
|
|
"fields" : {
|
|
|
|
"file" : {"index" : "no"},
|
2014-06-03 03:24:05 -04:00
|
|
|
"title" : {"store" : "yes"},
|
2013-08-20 10:03:31 -04:00
|
|
|
"date" : {"store" : "yes"},
|
|
|
|
"author" : {"analyzer" : "myAnalyzer"},
|
2014-06-03 03:24:05 -04:00
|
|
|
"keywords" : {"store" : "yes"},
|
|
|
|
"content_type" : {"store" : "yes"},
|
|
|
|
"content_length" : {"store" : "yes"},
|
|
|
|
"language" : {"store" : "yes"}
|
2012-03-04 04:59:22 -05:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2013-08-20 10:03:31 -04:00
|
|
|
}
|
|
|
|
```
|
2012-03-04 04:59:22 -05:00
|
|
|
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
In the above example, the actual content indexed is mapped under `fields` name `file`, and we decide not to index it, so
|
|
|
|
it will only be available in the `_all` field. The other fields map to their respective metadata names, but there is no
|
|
|
|
need to specify the `type` (like `string` or `date`) since it is already known.
|
|
|
|
|
|
|
|
Querying or accessing metadata
|
|
|
|
------------------------------
|
|
|
|
|
|
|
|
If you need to query on metadata fields, use the attachment field name dot the metadata field. For example:
|
|
|
|
|
|
|
|
```
|
|
|
|
DELETE /test
|
|
|
|
PUT /test
|
|
|
|
PUT /test/person/_mapping
|
|
|
|
{
|
|
|
|
"person": {
|
|
|
|
"properties": {
|
|
|
|
"file": {
|
|
|
|
"type": "attachment",
|
|
|
|
"path": "full",
|
|
|
|
"fields": {
|
|
|
|
"content_type": {
|
|
|
|
"type": "string",
|
|
|
|
"store": true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
PUT /test/person/1?refresh=true
|
|
|
|
{
|
|
|
|
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
|
|
|
|
}
|
|
|
|
GET /test/person/_search
|
|
|
|
{
|
|
|
|
"fields": [ "file.content_type" ],
|
|
|
|
"query": {
|
|
|
|
"match": {
|
|
|
|
"file.content_type": "text plain"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Will give you:
|
|
|
|
|
|
|
|
```
|
|
|
|
{
|
|
|
|
"took": 2,
|
|
|
|
"timed_out": false,
|
|
|
|
"_shards": {
|
|
|
|
"total": 5,
|
|
|
|
"successful": 5,
|
|
|
|
"failed": 0
|
|
|
|
},
|
|
|
|
"hits": {
|
|
|
|
"total": 1,
|
|
|
|
"max_score": 0.16273327,
|
|
|
|
"hits": [
|
|
|
|
{
|
|
|
|
"_index": "test",
|
|
|
|
"_type": "person",
|
|
|
|
"_id": "1",
|
|
|
|
"_score": 0.16273327,
|
|
|
|
"fields": {
|
|
|
|
"file.content_type": [
|
|
|
|
"text/plain; charset=ISO-8859-1"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
2012-03-04 04:59:22 -05:00
|
|
|
|
2012-03-07 14:56:48 -05:00
|
|
|
Indexed Characters
|
|
|
|
------------------
|
|
|
|
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
By default, `100000` characters are extracted when indexing the content. This default value can be changed by setting
|
|
|
|
the `index.mapping.attachment.indexed_chars` setting. It can also be provided on a per document indexed using the
|
|
|
|
`_indexed_chars` parameter. `-1` can be set to extract all text, but note that all the text needs to be allowed to be
|
|
|
|
represented in memory:
|
|
|
|
|
|
|
|
```
|
|
|
|
PUT /test/person/1
|
|
|
|
{
|
|
|
|
"my_attachment" : {
|
|
|
|
"_indexed_chars" : -1,
|
|
|
|
"_content" : "... base64 encoded attachment ..."
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
2012-03-07 14:56:48 -05:00
|
|
|
|
2012-11-30 14:25:31 -05:00
|
|
|
Metadata parsing error handling
|
|
|
|
-------------------------------
|
|
|
|
|
|
|
|
While extracting metadata content, errors could happen for example when parsing dates.
|
2014-07-25 11:53:19 -04:00
|
|
|
Parsing errors are ignored so your document is indexed.
|
2012-11-30 14:25:31 -05:00
|
|
|
|
|
|
|
You can disable this feature by setting the `index.mapping.attachment.ignore_errors` setting to `false`.
|
|
|
|
|
2013-10-24 05:52:51 -04:00
|
|
|
Language Detection
|
|
|
|
------------------
|
|
|
|
|
|
|
|
By default, language detection is disabled (`false`) as it could come with a cost.
|
|
|
|
This default value can be changed by setting the `index.mapping.attachment.detect_language` setting.
|
|
|
|
It can also be provided on a per document indexed using the `_detect_language` parameter.
|
|
|
|
|
2014-06-03 04:09:21 -04:00
|
|
|
Note that you can force language using `_language` field when sending your actual document:
|
|
|
|
|
|
|
|
```javascript
|
|
|
|
{
|
|
|
|
"my_attachment" : {
|
|
|
|
"_language" : "en",
|
2014-07-25 11:53:19 -04:00
|
|
|
"_content" : "... base64 encoded attachment ..."
|
2014-06-03 04:09:21 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
2013-10-24 05:52:51 -04:00
|
|
|
|
2014-06-03 03:27:30 -04:00
|
|
|
Highlighting attachments
|
|
|
|
------------------------
|
|
|
|
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
If you want to highlight your attachment content, you will need to set `"store": true` and `"term_vector":"with_positions_offsets"`
|
|
|
|
for your attachment field. Here is a full script which does it:
|
2014-06-03 03:27:30 -04:00
|
|
|
|
|
|
|
```
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
DELETE /test
|
|
|
|
PUT /test
|
|
|
|
PUT /test/person/_mapping
|
2014-06-03 03:27:30 -04:00
|
|
|
{
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
"person": {
|
|
|
|
"properties": {
|
|
|
|
"file": {
|
|
|
|
"type": "attachment",
|
|
|
|
"path": "full",
|
|
|
|
"fields": {
|
|
|
|
"file": {
|
|
|
|
"type": "string",
|
|
|
|
"term_vector":"with_positions_offsets",
|
|
|
|
"store": true
|
|
|
|
}
|
2014-06-03 03:27:30 -04:00
|
|
|
}
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
}
|
2014-06-03 03:27:30 -04:00
|
|
|
}
|
Add support for multi-fields
Now https://github.com/elasticsearch/elasticsearch/pull/6867 is merged in elasticsearch core code (branch 1.x - es 1.4),
we can support multi fields in mapper attachment plugin.
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment",
"path": "full",
"fields": {
"file": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
}
}
},
"content_type": {
"type": "string",
"fields": {
"store": {
"type": "string",
"store": true
},
"untouched": {
"type": "string",
"index": "not_analyzed",
"store": true
}
}
}
}
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"fields": [
"file.store",
"file.content_type.store"
],
"aggs": {
"store": {
"terms": {
"field": "file.content_type.store"
}
},
"untouched": {
"terms": {
"field": "file.content_type.untouched"
}
}
}
}
```
It gives:
```js
{
"took": 3,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 1,
"fields": {
"file.store": [
"\"God Save the Queen\" (alternatively \"God Save the King\"\n"
],
"file.content_type.store": [
"text/plain; charset=ISO-8859-1"
]
}
}
]
},
"aggregations": {
"store": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "1",
"doc_count": 1
},
{
"key": "8859",
"doc_count": 1
},
{
"key": "charset",
"doc_count": 1
},
{
"key": "iso",
"doc_count": 1
},
{
"key": "plain",
"doc_count": 1
},
{
"key": "text",
"doc_count": 1
}
]
},
"untouched": {
"doc_count_error_upper_bound": 0,
"buckets": [
{
"key": "text/plain; charset=ISO-8859-1",
"doc_count": 1
}
]
}
}
}
```
Note that using shorter definition works as well:
```
DELETE /test
PUT /test
{
"settings": {
"number_of_shards": 1
}
}
PUT /test/person/_mapping
{
"person": {
"properties": {
"file": {
"type": "attachment"
}
}
}
}
PUT /test/person/1?refresh=true
{
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
GET /test/person/_search
{
"query": {
"match": {
"file": "king"
}
}
}
```
gives:
```js
{
"took": 53,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 1,
"max_score": 0.095891505,
"hits": [
{
"_index": "test",
"_type": "person",
"_id": "1",
"_score": 0.095891505,
"_source": {
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
}
}
]
}
}
```
Closes #57.
(cherry picked from commit 432d7c0)
2014-07-25 18:03:28 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
PUT /test/person/1?refresh=true
|
|
|
|
{
|
|
|
|
"file": "IkdvZCBTYXZlIHRoZSBRdWVlbiIgKGFsdGVybmF0aXZlbHkgIkdvZCBTYXZlIHRoZSBLaW5nIg=="
|
|
|
|
}
|
|
|
|
GET /test/person/_search
|
|
|
|
{
|
|
|
|
"fields": [],
|
|
|
|
"query": {
|
|
|
|
"match": {
|
|
|
|
"file": "king queen"
|
|
|
|
}
|
|
|
|
},
|
|
|
|
"highlight": {
|
|
|
|
"fields": {
|
|
|
|
"file": {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
It gives back:
|
|
|
|
|
|
|
|
```js
|
|
|
|
{
|
|
|
|
"took": 9,
|
|
|
|
"timed_out": false,
|
|
|
|
"_shards": {
|
|
|
|
"total": 1,
|
|
|
|
"successful": 1,
|
|
|
|
"failed": 0
|
|
|
|
},
|
|
|
|
"hits": {
|
|
|
|
"total": 1,
|
|
|
|
"max_score": 0.13561106,
|
|
|
|
"hits": [
|
|
|
|
{
|
|
|
|
"_index": "test",
|
|
|
|
"_type": "person",
|
|
|
|
"_id": "1",
|
|
|
|
"_score": 0.13561106,
|
|
|
|
"highlight": {
|
|
|
|
"file": [
|
|
|
|
"\"God Save the <em>Queen</em>\" (alternatively \"God Save the <em>King</em>\"\n"
|
|
|
|
]
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
2014-06-03 03:27:30 -04:00
|
|
|
}
|
|
|
|
```
|
2013-10-24 05:52:51 -04:00
|
|
|
|
2012-06-10 16:14:18 -04:00
|
|
|
License
|
|
|
|
-------
|
|
|
|
|
|
|
|
This software is licensed under the Apache 2 license, quoted below.
|
|
|
|
|
2014-01-13 16:31:14 -05:00
|
|
|
Copyright 2009-2014 Elasticsearch <http://www.elasticsearch.org>
|
2012-06-10 16:14:18 -04:00
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License"); you may not
|
|
|
|
use this file except in compliance with the License. You may obtain a copy of
|
|
|
|
the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
|
|
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
|
|
License for the specific language governing permissions and limitations under
|
|
|
|
the License.
|