ElasticSearch - 搜索2个字符串字段失败

时间:2015-07-29 09:35:25

标签: elasticsearch term

我遇到了搜索错误 - 需要一些帮助。我有文章索引与id,标题,艺术家,流派领域。当我运行此查询时,我得到零结果 -

POST / d3acampaign / article / _search

    {
       "query": {
            "filtered": {
                "query": {
                    "match": {"genre": "metal"}    
                },
                "filter": {
                    "term": {"id": "7"}         
                }

            }
        }
    } 

但如果我将查询更改为类似的内容 - POST / d3acampaign / article / _search

    {
       "took": 1,
       "timed_out": false,
       "_shards": {
          "total": 5,
          "successful": 5,
          "failed": 0
       },
       "hits": {
          "total": 1,
          "max_score": 1.4054651,
          "hits": [
             {
                "_index": "d3acampaign",
                "_type": "article",
                "_id": "7",
                "_score": 1.4054651,
                "_source": {
                   "id": "7",
                   "title": "The Last Airbender",
                   "artist": "Somanath",
                   "genre": "metal"
                }
             }
          ]
       }
    } 

我得到以下结果 -

long myId // Primary key/id of row to be updated
DomainObject obj = gson.fromJson(jsonString, DomainObject.class)
obj.id=myId
obj.save(flush:true)

澄清 - 如果我尝试反对字符串,我注意到搜索失败,例如艺术家,标题

1 个答案:

答案 0 :(得分:0)

您获得空点击的原因是,当您使用term query进行查询时,它将与索引中的 确切术语 匹配 大写

并且默认分析器将使用小写创建索引。

  

分析文本的方法有很多种:默认的标准分析器   删除大多数标点符号,将文本分解为单个单词,以及   小例子。 https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

解决方案:

   {
       "query": {
            "filtered": {
                "query": {
                    "match": {"genre": "metal"}    
                },
                "filter": {
                    "term": {"artist": "somanath"}  //to lower case      
                }

            }
        }
    } 

另一种解决方案是将 索引映射 更改为 not_analyzed 作为索引类型。

完整的例子:

#!/bin/bash

curl -XDELETE "localhost:9200/testindex"
curl -XPUT "localhost:9200/testindex/?pretty" -d '
{
    "mappings":{
        "test":{
            "properties":{
                "name":{
                    "index":"not_analyzed",
                        "type":"string"
                }
            }
        }
    }
}'

curl -XGET "localhost:9200/testindex/_mapping?pretty"

curl -XPOST "localhost:9200/testindex/test/1" -d '{
    "name": "Jack"
}'

sleep 1
echo -e
echo -e
echo -e
echo -e "Filtered Query Search in not_analyzed index:"
echo -e

curl -XGET "localhost:9200/testindex/test/_search?pretty" -d '{
    "query": {
        "filtered": {
                "filter": {
                    "term": {"name": "Jack"}  
                }

        }
    }
}'