弹性搜索的问题在哪里' *'是这个领域

时间:2014-07-28 15:11:23

标签: python-3.x elasticsearch pyelasticsearch

所以,我应该通过说我明白*是一个特殊的字符,应该为弹性搜索查询进行转义。这是我面临的设置和麻烦。基本问题归结为我无法搜索仅包含' *'的字段。

curl -XPUT 'http://localhost:9200/test_index/test_item/1' -d '{
    "some_text" : "*"
}'
curl -XPUT 'http://localhost:9200/test_index/test_item/2' -d '{
    "some_text" : "1+*"
}'
curl -XPUT 'http://localhost:9200/test_index/test_item/3' -d '{
    "some_text" : "asterisk"
}'

curl -XGET 'http://localhost:9200/test_index/_search?q=some_text:*'

Results:
"hits":{"total":2,"max_score":1.0,"hits":[
    "_source":{"some_text" : "1+*"},
    "_source":{"some_text" : "asterisk"}
]


curl -XGET 'http://localhost:9200/test_index/_search?q=some_text:\*'

Results:
"hits":{"total":0,"max_score":null,"hits":[]}

Using python elasticsearch:

>>>from elasticsearch import Elasticsearch
>>> es = Elasticsearch()
>>>es.search(index='test_index', doc_type='test_item', body={"query":{"match":{"some_text":"*"}}})

No hits

>>>es.search(index='test_index', doc_type='test_item', body={"query":{"match":{"some_text":"asterisk"}}})

One hit('asterisk')

>>>es.search(index='test_index', doc_type='test_item', body={"query":{"match":{"some_text":"\*"}}})

No hits



Using pyelasticsearch
>>>es.search('some_text:*', index='test_index')
2 hits, '1+*' and 'asterisk'
>>>es.search('some_text:\*', index='test_index')
No hits

如何在搜索中显示第一项?尽管各种搜索方法之间存在不一致之处,但所有这些方法似乎都同意我不允许这样做。' *'回来了,为什么?此外,逃避*似乎使问题变得更糟,这有点不寻常。 (我假设库中可能存在一些自动转换,但这并不能解释直接的ES查询。)

编辑:我应该提到它绝对是索引的。

>>>es.get('test_index', 'test_item', 1)

{'_index': 'test_index', '_version': 1, '_id': '1', 'found': True, '_type': 'test_item', '_source': {'some_text': '*'}}

它可能存储了,据我所知,这对于弹性搜索来说是一个特殊的东西?

EDIT2: ElasticSearch docs that talk about escaping some

1 个答案:

答案 0 :(得分:0)

通过将分析仪更改为空白分析仪来解决此问题。 (这是一个lucene问题,而不是弹性搜索,这就是为什么很难找到它!)