Elasticsearch Percolator с питоном API
Привет, я пытаюсь сделать индекс перколятора, используя API "asticsearch.py ". Но я даже не получаю никаких результатов.
Документация API, кажется, имеет 3 или 4 функции, связанные с перколяцией.
Я проверил следующие возможности. Может ли кто-нибудь помочь, чтобы я мог решить это.
es = Elasticsearch()
query = {'query': {'term': {'message': 'bonsai tree'}}}
es.create(index='test', doc_type='message', percolate=query, id='kuku2', body = {"message":"bonsai tree"})
doc = {'doc': {'message': 'I am a bonsai tree'}}
k = es.percolate(index='test', doc_type='type1', body=doc)
print k
###### Результат #####
u'matches': [], u'total': 0, u'took': 0, u'_shards': {u'successful': 1, u'failed': 0, u'total': 1}}
Я надеюсь, что "es.percolate" используется для поиска. "es.create" позволяет нам регистрировать документы в виде индекса. Но это не так идеально упоминается в документации. ".percolate" также использовали вместо индекса. Пожалуйста помоги.
3 ответа
Следующий фрагмент текста работает для меня (на ES 1.4.4). Ключевым моментом, похоже, является использование doc_type='.percolator'
в es.create
,
from elasticsearch import Elasticsearch
from elasticsearch.client.indices import IndicesClient
es = Elasticsearch()
ies = IndicesClient(es)
mapping = {
"mappings": {
"my-type": {
"properties": {
"content": {
"type": "string"
}
}
}
}
}
ies.create(index='test_index', body=mapping)
query = {
"query": {
"match": {
"content": "python"
}
}
}
es.create(index='test_index', doc_type='.percolator', body=query, id='python')
doc1 = {'doc': {'content': 'this is something about python'}}
res = es.percolate("test_index", doc_type="my-type", body = doc1)
print res
# result:
# {u'matches': [{u'_id': u'python', u'_index': u'test_index'}], u'total': 1, u'took': 3, u'_shards': {u'successful': 5, u'failed': 0, u'total': 5}}
doc2 = {'doc': {'content': 'this is another piece of text'}}
res = es.percolate("test_index", doc_type="my-type", body = doc2)
print res
# result:
# {u'matches': [], u'total': 0, u'took': 2, u'_shards': {u'successful': 5, u'failed': 0, u'total': 5}}
Я немного подправил ответ @Roy2012 для использования с ES 5.1
Вот мой код:
import pprint
from elasticsearch import Elasticsearch
# Use your elasticsearch user, password, and host below
es = Elasticsearch(['http://user:password@host:9200/'])
mapping = {
"mappings": {
"doctype": {
"properties": {
"comment": {
"type": "text"
}
}
},
"queries": {
"properties": {
"query": {
"type": "percolator"
}
}
}
}
}
es.indices.create(index='comment_percolators', body=mapping, ignore=400)
word = "python"
query = {
"query": {
"match": {
"comment": word
}
}
}
res = es.index(index='comment_percolators', doc_type='queries', body=query, id=word)
pprint.pprint(res)
doc1 = {'doc': {'comment': 'this is something about python'}}
res = es.percolate(index="comment_percolators", doc_type="doctype", body=doc1)
pprint.pprint(res)
# {u'_shards': {u'failed': 0, u'successful': 5, u'total': 5},
# u'matches': [{u'_id': u'python', u'_index': u'comment_percolators'}],
# u'took': 16,
# u'total': 2}
doc2 = {'doc': {'comment': 'this is another piece of text'}}
res = es.percolate(index="comment_percolators", doc_type="doctype", body=doc2)
pprint.pprint(res)
# {u'_shards': {u'failed': 0, u'successful': 5, u'total': 5},
# u'matches': [],
# u'took': 23,
# u'total': 0}
Разница лишь в том, как вы создаете индекс и регистрируете свой запрос.
Термин запрос не будет разбивать или анализировать текст поиска. Следовательно, если дать фразу там, запрос по термину будет искать точное совпадение токена. Который не существует. Так что, если вы используете запрос на совпадение, он должен работать
es = Elasticsearch()
query = {'query': {'match': {'message': 'bonsai tree'}}}
es.create(index='test', doc_type='message', percolate=query, id='kuku2', body = {"message":"bonsai tree"})
doc = {'doc': {'message': 'I am a bonsai tree'}}
k = es.percolate(index='test', doc_type='type1', body=doc)
print k