#!/usr/bin/env python
# coding: utf-8

# Works OK with "nfc"
NORMALIZER_TYPE = "nfkc"

ES_URL = "http://localhost:9200"

# "text" for ES 5
# "string" for ES 1.7
FIELD_TYPE = "text"

################################################################################################################

import sys
sys.path.append('/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages')
import json
import requests
import time

session = requests.Session()

urlIndex = ES_URL + "/documents"

# Delete index
print "Deleting index"
ret = session.delete(urlIndex)

# Create Index with analyzer, filters and mapping
settings = {
		"settings": {
			"analysis": {
			  	"analyzer": {
			  		"exact_analyzer": {
					  "type": "custom",
					  "tokenizer": "keyword",
					  "filter": ["truncate_field"],
					  "char_filter": "nfkc_normalizer"
					}
			  	},
				"char_filter": {
					"nfkc_normalizer": {
						"type": "icu_normalizer",
						"name": NORMALIZER_TYPE
					}
				},
				"filter": {
					"truncate_field": {
						"type": "truncate",
						"length": 1000
					},  
				}
			}
		}
}
print "Creating index"
ret = session.put(urlIndex, json=settings)
if ret.status_code != 200:
	print 'Error creating settings'
	print `ret.text`
	sys.exit()

mapping = { 
	"properties": {
		"location": {
			"type": "string",
			"index": "no",
			"fields": {
				"exact": {
					"type": FIELD_TYPE,
					"term_vector": "with_positions_offsets",
					"analyzer": "exact_analyzer"
				  },
			}
		}
	}
}
print "Creating mapping"
ret = session.put(urlIndex + '/_mapping/photo', json=mapping)
if ret.status_code != 200:
	print 'Error creating mappings'
	print `ret.text`
	sys.exit()

# Create document
doc = { "location": "NY" }
print "\nCreating document Location: NY"
print "---------------------------------------------------------"
print `doc`
print "---------------------------------------------------------"
ret = session.post(urlIndex + '/photo', json=doc)
if ret.status_code != 201:
	print 'Error creating document'
	print `ret.text`
	sys.exit()

doc = { "location": "París" }
print "\nCreating document Location: París"
print "---------------------------------------------------------"
print `doc`
print "---------------------------------------------------------"
ret = session.post(urlIndex + '/photo', json=doc)
if ret.status_code != 201:
	print 'Error creating document'
	print `ret.text`
	sys.exit()

doc = { "location": "Li´ege" }
print "\nCreating document Location: Li´ege"
print "---------------------------------------------------------"
print `doc`
print "---------------------------------------------------------"
ret = session.post(urlIndex + '/photo', json=doc)
if ret.status_code != 201:
	print 'Error creating document'
	print `ret.text`
	sys.exit()

time.sleep(2)
filter = {
    "size": 1000,
    "from": 0,
    "query": {
        "filtered": {
            "query": {
                "bool": {
                    "minimum_should_match": 1,
                    "must": [
                        {
                            "terms": {
                                "photo.location.exact": [
                                    "NY",
				    "París",
                                    "Li´ege"
                                ]
                            }
                        }
                    ]
                }
            }
        }
    }
}
print "\nSearching filtering by location = NY, París or Li´ege.  Total should be 3"
print "---------------------------------------------------------"
print `filter`
print "---------------------------------------------------------"
ret = session.post(urlIndex + '/_search', json=filter)
obj = json.loads(str(ret.text))
print "Total: " + `obj["hits"]["total"]`
print "Locations: "
for o in obj["hits"]["hits"]:
	print "    " + o["_source"]["location"]

search = {
	"query": {
		"match": {
			"photo.location.exact": {
				"query": "Li´ege"
			}
		}
	}
}
print "\nSearching querying by location = Li´ege.  Total should be 1"
print "---------------------------------------------------------"
print `search`
print "---------------------------------------------------------"
ret = session.post(urlIndex + '/_search', json=search)
obj = json.loads(str(ret.text))
print "Total: " + `obj["hits"]["total"]`
print "Locations: "
for o in obj["hits"]["hits"]:
	print "    " + o["_source"]["location"]

