案例介绍
我的情况是在弹性搜索索引中存储一些单词,每个单词都得到它的ID。 我的查询数据是一些消息。当查询数据消息中有一些标点符号时,Elasticsearch会给出错误的答案。
示例:
例如,我在索引中存储了关键字“banana,apple,pen”。我使用bulk_index API存储它 查询数据1:“这是香蕉吗?”
正确的结果应该是关键字“banana”,但现在它什么都没有。
查询数据2:“>>这是一本书”
结果应该没有任何结果,但现在它会命中索引中的所有关键字。
没有标点符号,查询结果将正常工作。
代码:
我的storeToIndex代码:(python,pyelasticsearch作为客户端)
es=ElasticSearch('http://localhost:9200/')
rval = es.bulk_index('%s'%index_name,'json',doc, id_field="id")
我的qeuryIndex()
代码query={"query":{"query_string":{"query":"%s"%query_data}}}
es=ElasticSearch('http://localhost:9200/')
search_result=es.search(query=query,index=index_name,doc_type='json')
问题:
我可以使用常规快递来解决它 但是有没有使用elasticsearch设置的解决方案?过滤器或API之类的东西?
环境配置:
Ubuntu 12.04桌面64位
Ubuntu中的Elasticsearch服务器,版本0.90.7,单节点
客户:pyelasticsearch
编程语言:python
使用的API:bulk_index API,搜索API
答案 0 :(得分:3)
您遇到的是query string parsing。 banana?
被解释为以banana
开头并以单个未指定字符结尾的术语。例如,这将匹配banana1
。并且>> ....
正在创建一个开放式的远程查询,这就是它匹配索引中所有内容的原因。
我建议您考虑使用其他查询类型,例如为此类案例设计的match query。
使用四个查询查看this play(请参阅左下方面板中的搜索标签),为方便起见,此处将其导出为Curl命令:
#!/bin/bash
export ELASTICSEARCH_ENDPOINT="http://localhost:9200"
# Create indexes
curl -XPUT "$ELASTICSEARCH_ENDPOINT/play" -d '{
"settings": {}
}'
# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"play","_type":"type"}}
{"somefield":"banana"}
{"index":{"_index":"play","_type":"type"}}
{"somefield":"apple"}
{"index":{"_index":"play","_type":"type"}}
{"somefield":"pen"}
'
# Do searches
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
"query": {
"query_string": {
"query": "is this banana?"
}
}
}
'
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
"query": {
"match": {
"somefield": {
"query": "is this banana?"
}
}
}
}
'
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
"query": {
"query_string": {
"query": ">> it is a book"
}
}
}
'
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
"query": {
"match": {
"somefield": {
"query": ">> it is a book"
}
}
}
}
'