【问题标题】:Facets tokenize tags with spaces. Is there a solution?构面用空格标记标签。有解决办法吗?
【发布时间】:2012-08-16 16:00:57
【问题描述】:

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

我有以下映射:

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" 时,我会得到结果。
但是还是有区分大小写的问题。
如果我通过 removing keyword analyzer 运行相同的上述查询,那么我得到的结果是:

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


这里 Victoria Secret"not_analyzed" 中区分大小写,但在 count 中占用空间,但是当我使用 lowercase 进行查询时> 作为“维多利亚的秘密”,它没有给出任何结果。


有什么建议吗??

谢谢,
苏拉杰

【问题讨论】:

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


    【解决方案1】:

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

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

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

    除此之外,当然如果您不分析该字段,标签Victoria Secret 将按原样被索引,因此查询victoria secret 将不匹配。如果您希望它不区分大小写,您需要定义一个使用KeyworkTokenizercustom analyzer,因为您不想标记它和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) 已弃用文本查询。

    【讨论】:

    • 是的,我已经在我的应用程序中实现了它。再次感谢:)
    【解决方案2】:

    我认为这对我的回答有些道理

    https://gist.github.com/2688072

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-28
      • 2019-11-20
      • 1970-01-01
      • 2015-03-13
      • 2018-06-05
      • 2019-11-28
      • 1970-01-01
      • 2019-07-03
      相关资源
      最近更新 更多