我有弹性搜索的问题。索引中有一个项目(“'title':'使用Python与Elasticsearch'”)。我只能通过确切的查询得到返回的结果。然而,当我搜索“'标题':'使用Python'时,”代码可以什么都不打 es版本是:{u'cluster_name':u'elasticsearch',u'tagline':你知道,搜索',u'version':{u'lucene_version':u'5.4.1',你' build_hash':u'd045fc29d1932bce18b2e65ab8b297fbf6cd41a1',u'number':u'2.2.1',u'build_timestamp':u'2016-03-09T09:38:54Z',u'build_snapshot':False},u'name' :u'Lorelei Travis'} 如果我是对的,那应该是2.2.1。代码附后。那么,当我使用像“使用Python”这样的查询进行搜索时,如何在没有完全匹配查询的情况下搜索命中。谢谢!
INDEX_NAME = 'test_11'
from elasticsearch import Elasticsearch
es = Elasticsearch()
print es.info()
request_body = {
"mappings":{
"post":{
"properties":{
"title":{
"type":"string",
"index":"analyzed"
}
}
}
}
}
if es.indices.exists(INDEX_NAME):
res = es.indices.delete(index = INDEX_NAME)
print(" response: '%s'" % (res))
res = es.indices.create(index = INDEX_NAME, body=request_body)
print res
es.index(index=INDEX_NAME, doc_type='post', id=1, body={
'title': 'Using Python with Elasticsearch'
}
)
es.indices.refresh(index=INDEX_NAME)
res = es.search(index=INDEX_NAME, body={'query': {'match': {'title': 'Using Python with Elasticsearch'}}})
#res = es.search(index=INDEX_NAME, body ={"query":{"match":{"title":"Using Python with"}}})
print '\n'
res = es.indices.get(index=INDEX_NAME)
print res
答案 0 :(得分:0)
使用prefix查询?如果您想要更高级的内容,请考虑regexp查询或fuzzy查询。
编辑:如果我错了,请纠正我:您希望Using Python with
匹配Using Python with Elasticsearch
,Using Python with Lucene
等所有结果?然后是一个映射:
request_body = {
"mappings":{
"post":{
"properties":{
"title":{
"type":"string",
"index":"not_analyzed"
}
}
}
}
}
然后查询如下:
{
"query": {
"prefix": {
"title": "Using Python with"
}
}
}
应归还所有相关文件。
注意我将index
字段更改为not_analyzed
。
更多here。
编辑2: 如果要匹配目标字段中任何位置包含完全查询的所有文档,而不仅仅是作为前缀,请使用最初建议的regexp查询。然后
{
"query": {
"wildcard": {
"name": "Using Python with*"
}
}
}
将像前缀查询一样工作并匹配Using Python with Elasticsearch
和Using Python with Lucene
,但
{
"query": {
"wildcard": {
"name": "*Python with Elasticsearch"
}
}
}
仅匹配Using Python with Elasticsearch
。它与Using Python with elasticsearch
不匹配,但您说您希望完全词组匹配。