0

我对带有空格的分面标记标签有一些问题。

我有以下映射:

    curl -XPOST "http://localhost:9200/pictures" -d '
    {
      “映射”:{
        “图片” : {
                “特性” : {
                    "id": { "type": "string" },
                    “描述”:{“类型”:“字符串”,“索引”:“未分析”},
                    “特色”:{“类型”:“布尔”},
                    “类别”:{“类型”:“字符串”,“索引”:“未分析”},
                    “标签”:{“类型”:“字符串”,“索引”:“not_analyzed”,“分析器”:“关键字”},
                    “created_at”:{“类型”:“双”}
                }
            }
        }
    }'

我的数据是:

    curl -X POST "http://localhost:9200/pictures/picture" -d '{
      “图片”: {
        "id": "4defe0ecf02a8724b8000047",
        "title": "Victoria Secret PhotoShoot",
        "description": "来自法国和意大利",
        “特色”:是的,
        “类别”:[
          “时尚”,
          “女孩们”,
        ],
        “标签”:[
          “女孩”,
          “照片拍摄”,
          “超模”,
          《维多利亚的秘密》
        ],
        “created_at”:1405784416.04672
      }
    }'

我的查询是:

    curl -X POST "http://localhost:9200/pictures/_search?pretty=true" -d '
    {
      “询问”: {
        “文本”: {
          “标签”:{
            “查询”:“维多利亚的秘密”
          }
        }
      },
      “方面”:{
        “标签”:{
          “条款”:{
            “字段”:“标签”
          }
        }
      }
    }'

输出结果是:

    {
      “采取”:1,
      “超时”:假,
      “_shards”:{
        “总数”:5,
        “成功”:5,
        “失败”:0
      },
      “命中”:{
        “总计”:0,
        “max_score”:空,
        “命中”:[]
      },
      “方面”:{
        “标签”:{
          “_type”:“条款”,
          “失踪”:0,
          “总计”:0,
          “其他”:0,
          “条款”:[]
        }
      }
    }

现在,我在方面得到了总 0 并且总命中数为 0
任何想法为什么它不起作用?
我知道当我从标签中删除关键字分析器并将其设为“not_analyzed”时,我会得到结果。
但是仍然存在区分大小写的问题。
如果我通过删除关键字分析器运行相同的上述查询,那么我得到的结果是:

    方面:{
        标签: {
            _type:条款
            失踪:0
            总数:12
            其他:0
            条款:[
                {
                    词条:拍照
                    计数:1
                }
                {
                    词条:少女
                    计数:1
                }
                {
                    词条:维多利亚的秘密
                    计数:1
                }
                {
                    名词:超模
                    计数:1
                }         
            ]
        }

    }


这里Victoria Secret在"not_analyzed"中区分大小写,但它在count中占用空间,但是当我用小写查询为 "victoria secret" 时,它不会给出任何结果。


有什么建议么??

谢谢,
苏拉杰

4

2 回答 2

4

第一个例子对我来说并不完全清楚。如果您使用KeywordAnalyzer,则意味着该字段将按原样被索引,但是根本不分析该字段更有意义,这是相同的。您发布的映射包含

"index": "not_analyzed", "analyzer": "keyword"

这没有多大意义。如果您不分析该领域,为什么要为其选择分析器?

除此之外,当然,如果您不分析该字段,该标签Victoria Secret将按原样被索引,因此查询victoria secret将不匹配。如果您希望它不区分大小写,则需要定义一个使用KeyworkTokenizer的自定义分析器,因为您不想标记它和LowercaseTokenFilter。您可以通过索引设置分析部分定义自定义分析器,然后在映射中使用它。但是那样的话,刻面总是小写的,我猜这是你不喜欢的。这就是为什么最好定义一个多字段并使用两种不同的文本分析来索引该字段,一种用于构面,一种用于搜索。

您可以像这样创建索引:

curl -XPOST "http://localhost:9200/pictures" -d '{
    "settings" : {
        "analysis" : {
            "analyzer" : {
              "lowercase_analyzer" : {
                "type" : "custom",
                "tokenizer" : "keyword",
                "filter" : [ "lowercase"]
              }
            }
        }
    },
    "mappings" : {
        "pictures" : {
            "properties" : {
                "id": { "type": "string" },
                "description": {"type": "string", "index": "not_analyzed"},
                "featured": { "type": "boolean" },
                "categories": { "type": "string", "index": "not_analyzed" },
                "tags" : {
                    "type" : "multi_field",
                    "fields" : {
                        "tags": { "type": "string", "analyzer": "lowercase_analyzer" },
                        "facet": {"type": "string", "index": "not_analyzed"},
                    }
                },
                "created_at": { "type": "double" }
            }
        }
    }
}'

然后,当您在该字段上搜索时,默认情况下自定义的 lowercase_analyzer 也将应用于文本查询,以便您可以搜索Victoria Secretvictoria secret获取结果。您需要更改构面部分并在新tags.facet字段上制作构面,不进行分析。

此外,您可能希望查看匹配查询,因为文本查询已被最新的 elasticsearch 版本 (0.19.9) 弃用。

于 2012-08-29T14:19:11.767 回答
0

我认为这对我的回答有些意义

https://gist.github.com/2688072

于 2012-08-22T10:57:49.827 回答