elasticsearch与破折号完全匹配

时间:2013-12-22 11:03:04

标签: ruby-on-rails ruby elasticsearch tire

我们在elasticsearch中有一个域名索引(我们使用带有ruby的轮胎gem连接并维护它)但是我们在精确搜索时遇到了麻烦。

如果我在域中搜索术语google.com,它会带回google.com,但它也会带回任何带有短划线( - )的域名,例如in-google.com,research引导我相信 - 在ES中是一个通配符,我需要做的就是不进行分析,但这不起作用。

    :domain       => { :type => 'string' , :analyzer => 'whitespace'                          },
    :domain_2     => { :type => 'string' , :analyzer => 'pattern'                          },
    :domain_3     => { :type => 'string', :index => 'not_analyzed'                           },
    :domain_4     => { :type => 'string', :analyzer => 'snowball'                            }

我已经尝试过不同的分析器,如上所示,但在使用“head”插件进行搜索时,它们都有相同的问题。

https://gist.github.com/anonymous/8080839是我用来生成要测试的数据集的代码,我正在寻找的是搜索JUST google的能力,如果我想要*谷歌我可以实现我自己的通配符?

我已经辞职了,我将不得不删除并重新生成我的索引,但无论我选择或键入什么分析器,我仍然无法获得完全匹配

1 个答案:

答案 0 :(得分:2)

您没有显示您正在使用的示例查询。您确定您的查询和索引使用相同的文本处理吗?

此外,您可能希望查看multi_field - 以多种方式分析事物的方法。

我已经制作了一个可运行的示例,其中包含一些不同的查询来说明这一点。请注意,域名已通过两种方式编入索引,并记下查询所针对的字段:https://www.found.no/play/gist/ecc52fad687e83ddcf73

#!/bin/bash

export ELASTICSEARCH_ENDPOINT="http://localhost:9200"

# Create indexes

curl -XPUT "$ELASTICSEARCH_ENDPOINT/play" -d '{
    "mappings": {
        "type": {
            "properties": {
                "domain": {
                    "type": "multi_field",
                    "fields": {
                        "domain": {
                            "type": "string",
                            "analyzer": "standard"
                        },
                        "whitespace": {
                            "type": "string",
                            "analyzer": "whitespace"
                        }
                    }
                }
            }
        }
    }
}'


# Index documents
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_bulk?refresh=true" -d '
{"index":{"_index":"play","_type":"type"}}
{"domain":"google.com"}
{"index":{"_index":"play","_type":"type"}}
{"domain":"in-google.com"}
'

# Do searches

# Matches both
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "query": {
        "match": {
            "_all": "google.com"
        }
    }
}
'

# Also matches "google.com". in-google.com gets tokenized to ["in", "google.com"]
# and the default match operator is `or`.
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "query": {
        "match": {
            "domain": {
                "query": "in-google.com"
            }
        }
    }
}
'

# What terms are generated? (Answer: `google.com` and `in`)
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "size": 0,
    "facets": {
        "domain": {
            "terms": {
                "field": "domain"
            }
        }
    }
}
'

# This should just match the second document.
curl -XPOST "$ELASTICSEARCH_ENDPOINT/_search?pretty" -d '
{
    "query": {
        "match": {
            "domain.whitespace": {
                "query": "in-google.com"
            }
        }
    }
}
'