Facets用空格标记标签。有解决方案吗?

时间:2012-08-21 10:09:57

标签: json lucene full-text-search elasticsearch facets

我遇到了带有空格的刻面标记化标记的问题。

我有以下映射:


    curl -XPOST "http://localhost:9200/pictures" -d '
    {
      "mappings" : {
        "pictures" : {
                "properties" : {
                    "id": { "type": "string" },
                    "description": {"type": "string", "index": "not_analyzed"},
                    "featured": { "type": "boolean" },
                    "categories": { "type": "string", "index": "not_analyzed" },
                    "tags": { "type": "string", "index": "not_analyzed", "analyzer": "keyword" },
                    "created_at": { "type": "double" }
                }
            }
        }
    }'

我的数据是:


    curl -X POST "http://localhost:9200/pictures/picture" -d '{
      "picture": {
        "id": "4defe0ecf02a8724b8000047",
        "title": "Victoria Secret PhotoShoot",
        "description": "From France and Italy",
        "featured": true,
        "categories": [
          "Fashion",
          "Girls",
        ],
        "tags": [
          "girl",
          "photoshoot",
          "supermodel",
          "Victoria Secret"
        ],
        "created_at": 1405784416.04672
      }
    }'

我的查询是:


    curl -X POST "http://localhost:9200/pictures/_search?pretty=true" -d '
    {
      "query": {
        "text": {
          "tags": {
            "query": "Victoria Secret"
          }
        }
      },
      "facets": {
        "tags": {
          "terms": {
            "field": "tags"
          }
        }
      }
    }'

输出结果为:


    {
      "took" : 1,
      "timed_out" : false,
      "_shards" : {
        "total" : 5,
        "successful" : 5,
        "failed" : 0
      },
      "hits" : {
        "total" : 0,
        "max_score" : null,
        "hits" : [ ]
      },
      "facets" : {
        "tags" : {
          "_type" : "terms",
          "missing" : 0,
          "total" : 0,
          "other" : 0,
          "terms" : [ ]
        }
      }
    }

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


    facets: {
        tags: {
            _type: terms
            missing: 0
            total: 12
            other: 0
            terms: [
                {
                    term: photoshoot
                    count: 1
                }
                {
                    term: girl
                    count: 1
                }
                {
                    term: Victoria Secret
                    count: 1
                }
                {
                    term: supermodel
                    count: 1
                }         
            ]
        }

    }


这里维多利亚秘密“not_analyzed”中区分大小写,但在计数中占用空间,但当我用小写作为“维多利亚秘密”,它没有给出任何结果。


有什么建议吗?

谢谢,
苏拉杰

2 个答案:

答案 0 :(得分:4)

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

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

这没有多大意义。如果您没有分析该领域,为什么会选择分析仪呢?

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

您可以像这样创建索引:

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字段上创建构面,而不会对其进行分析。

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

答案 1 :(得分:0)

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

https://gist.github.com/2688072