带有标点符号的Elasticsearch查询数据将导致错误的查询结果

时间:2013-12-12 13:17:20

标签: python-2.7 elasticsearch

案例介绍

我的情况是在弹性搜索索引中存储一些单词,每个单词都得到它的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

1 个答案:

答案 0 :(得分:3)

您遇到的是query string parsingbanana?被解释为以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"
            }
        }
    }
}
'