我们在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的能力,如果我想要*谷歌我可以实现我自己的通配符?
我已经辞职了,我将不得不删除并重新生成我的索引,但无论我选择或键入什么分析器,我仍然无法获得完全匹配
答案 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"
}
}
}
}
'