gpt4 book ai didi

ruby-on-rails - elasticsearch 与破折号完全匹配

转载 作者:太空宇宙 更新时间:2023-11-03 16:02:54 25 4
gpt4 key购买 nike

我们在 elasticsearch 中有一个域名索引(我们使用 tire gem 和 ruby​​ 来连接和维护它)但是我们在精确搜索时遇到了问题。

如果我在域中搜索术语 google.com,它会带回 google.com,但它还会带回任何带破折号 (-) 的域,例如 in-google.com、research让我相信 - 是 ES 中的通配符,我需要做的就是将 not_analyzed 放上去,但这不起作用。

    :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 的能力,如果我想要 *google 我可以实现我自己的通配符?

我已经接受了我将不得不删除并重新生成我的索引这一事实,但无论我选择或输入什么分析器,我仍然无法获得精确匹配

最佳答案

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

此外,您可能想查看 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"
}
}
}
}
'

关于ruby-on-rails - elasticsearch 与破折号完全匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20728680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com