gpt4 book ai didi

ruby-on-rails - ElasticSearch with Tire与 'string'搜索上的nGrams不匹配,仅 'text'

转载 作者:行者123 更新时间:2023-12-02 22:47:26 25 4
gpt4 key购买 nike

所以我一直在尝试将nGram匹配添加到我的ElasticSearch索引中,但是我遇到了以下问题。

执行标准字符串查询仅返回完全匹配。在特定测试字段上运行匹配查询会产生预期的nGram匹配。

我根据these(1) examples(2)为我的字段设置了nGram过滤器和分析器。映射代码如下:

tire.settings :number_of_shards => 1,
:number_of_replicas => 1,
:analysis => {
:analyzer => {
"str_search_analyzer" => {
"tokenizer" => "keyword",
"filter" => "lowercase"
},
"str_index_analyzer" => {
"tokenizer" => "keyword",
"filter" => ["lowercase","substring"]
}
},
:filter => {
:substring => {
"type" => "nGram",
"min_gram" => 1,
"max_gram" => 10
}
}
} do
mapping do
indexes :test, :type=>'string',
:search_analyzer => :str_search_analyzer,
:index_analyzer=>:str_index_analyzer
end
end

def to_indexed_json
#adding known word plus random string for testing
{
:test => "pizza" + (0...10).map{ ('a'..'z').to_a[rand(26)] }.join
}.to_json
end

ElasticSearch查询

产生结果的查询:
curl -X GET "http://localhost:9200/users/_search?pretty=true" -d '{"query":{"text":{"test":{"query":"piz"}}}}'

没有结果的查询:
curl -X GET "http://localhost:9200/users/_search?pretty=true" -d '{"query":{"query_string":{"query":"pizz"}}}'

有什么方法可以使一般的query_string搜索能够遍历所有索引字段并匹配ngram,而不必在特定列上进行文本/匹配搜索?

最佳答案

这是预期的行为。默认情况下,对“_all”字段执行“query_string”查询。并且由于使用StandardAnalyzer对该字段进行了索引,因此其索引标记将与“test”字段(您配置为使用nGram分析器)的标记不同。

您可以通过几种方式来更改此行为:

  • 更改索引设置中的映射,并为“_all”字段
  • 配置nGram分析器
  • 作为文档的一部分发送和“_analyzer”字段(它将被拾取并用于未为其配置显式分析器的所有字段)
  • 使用“fields”属性
  • 指定要在“query_string”上执行的字段

    在以上所有三个选项中,最推荐使用#3。明确指定字段可让您对数据进行更多控制(如何对数据进行索引和查询)。

    关于ruby-on-rails - ElasticSearch with Tire与 'string'搜索上的nGrams不匹配,仅 'text',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12112568/

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