【问题标题】:Elasticsearch ignore words breakersElasticsearch 忽略分词器
【发布时间】:2012-11-16 11:32:52
【问题描述】:

我是 Elasticsearch 的新手,但在查询方面遇到了问题。

我这样索引字符串:

my-super-string
my-other-string
my-little-string

这个字符串是蛞蝓。 所以,它们不是空格,只有字母数字字符。相关字段的映射只有“type=string”。

我正在使用这样的查询:

{ "query":{ "query_string":{ "query": "*"+<MY_QUERY>+"*", "rewrite": "top_terms_10" } }}

其中“MY_QUERY”也是一个蛞蝓。例如“我的超级”之类的东西。

当搜索“我的”时,我得到了结果。

当搜索“my-super”时,我没有得到任何结果,我想要“my-super-string”。

有人可以帮我解决这个问题吗?谢谢!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    我建议使用 match_phrase 而不是使用带有前导和尾随通配符的查询字符串。即使是标准分析器也应该能够正确地将 slug 拆分为标记,因此不需要通配符。

    curl -XPUT "localhost:9200/slugs/doc/1" -d '{"slug": "my-super-string"}'
    echo
    curl -XPUT "localhost:9200/slugs/doc/2" -d '{"slug": "my-other-string"}'
    echo
    curl -XPUT "localhost:9200/slugs/doc/3" -d '{"slug": "my-little-string"}'
    echo
    curl -XPOST "localhost:9200/slugs/_refresh"
    echo
    echo "Searching for my"
    curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "my"} } }'
    echo
    echo "Searching for my-super"
    curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "my-super"} } }'
    echo
    echo "Searching for my-other"
    curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "my-other"} } }'
    echo
    echo "Searching for string"
    curl "localhost:9200/slugs/doc/_search?pretty=true&fields=slug" -d '{"query" : { "match_phrase": {"slug": "string"} } }'
    

    或者,您可以创建自己的分析器,仅在“-”上将 slug 拆分为标记

    curl -XDELETE localhost:9200/slugs
    curl -XPUT localhost:9200/slugs -d '{
        "settings": {
            "index": {
                "number_of_shards": 1,
                "number_of_replicas": 0,
                "analysis": {
                    "analyzer" : {
                        "slug_analyzer" : {
                            "tokenizer": "slug_tokenizer",
                            "filter" : ["lowercase"]
                        }
                    },
                    "tokenizer" :{
                        "slug_tokenizer" : {
                            "type": "pattern",
                            "pattern": "-"
                        }
                    }
                }
            }
        },
        "mappings" :{
            "doc" : {
                "properties" : {
                    "slug" : {"type": "string", "analyzer" : "slug_analyzer"}
                }
            }
        }
    }'
    

    【讨论】:

    • 使用 match_phrase 我必须完全匹配才能得到结果。所以我尝试了 match_phrase_prefix,效果很好,但如果我搜索“super-s”我想得到“my-super-string”,我还需要一个“match_phrase_suffix”。事实上,我想要一个像*-str* 这样的简单通配符,它​​可以匹配任何包含“-str”的slug。这是我遇到问题的“-”字符。每当我有一个查询时,我都没有得到任何结果。
    • 哦,我明白了。然后是这样的:stackoverflow.com/questions/6467067/…
    • 再次感谢您...我已经接近最终结果,但我仍然对“-”字符有问题。我真的想要完全匹配。我需要一个真正精确的通配符(但你在另一篇文章中说不要使用它^^)。我不知道如何索引,以及如何搜索。如果我输入“my-super”,我想要所有包含“my-super”的文档。 “-”似乎打破了一切。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    • 1970-01-01
    • 2015-12-20
    • 2022-10-08
    • 2012-01-28
    • 1970-01-01
    相关资源
    最近更新 更多