0

したがって、* はelasticsearchクエリでエスケープする必要がある特殊文字であることを理解しているということで、これにプレフィックスを付ける必要があります。これが私が直面しているセットアップとトラブルです。基本的な問題は、'*' のみを含むフィールドを検索できないということです。

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': '*'}}

保存されている可能性がありますが、私の知る限り、これはelasticsearchにとって特別なものですか?

Edit2: いくつかのエスケープについて話しているElasticSearchドキュメント

4

1 に答える 1