小编Den*_*rov的帖子

在弹性搜索中查找带有特殊字符的子字符串

我是弹性搜索的新手.我想通过子串搜索,子串由数字和符号组成,如"/"和" - ".例如,我使用默认设置和一个索引字段创建索引:

curl -XPUT "http://localhost:9200/test/" -d ' {
    "mappings" : {
            "properties": {
                    "test_field": {
                            "type": "string"
                    }
            }
    }
} '
Run Code Online (Sandbox Code Playgroud)

然后,我将一些数据添加到我的索引中:

curl -XPOST "http://localhost:9200/test/test_field" -d '{ "test_field" : "14/21-35" }'
curl -XPOST "http://localhost:9200/test/test_field" -d '{ "test_field" : "1/1-35" }'
curl -XPOST "http://localhost:9200/test/test_field" -d '{ "test_field" : "1/2-25" }'
Run Code Online (Sandbox Code Playgroud)

刷新索引后,我执行搜索.所以,我想找到数据,其中"test_field"以"1/1"开头.我的请求:

curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{"query":{"query_string":{"query":"1/1*"}}}'
Run Code Online (Sandbox Code Playgroud)

没有命中.如果我删除星号,那么作为回应我看到两个命中:"1/1-35"和"1/2-25".如果我试图通过反斜杠("1\/ 1*")转义斜杠符号,结果分别相同.

当我的查询中有" - "符号时,我必须逃避这个Lucene特殊字符.所以我发送下一个搜索请求:

curl -X GET "http://localhost:9200/test/_search?pretty=true" -d '{"query":{"query_string":{"query":"*1\-3*"}}}'
Run Code Online (Sandbox Code Playgroud)

并返回解析错误.如果我双重逃避("\\")减去,那么我没有结果.

当查询包含这些字符时,我不知道搜索是如何执行的.也许我做错了什么.

尝试在自定义分析器中使用 …

lucene elasticsearch

5
推荐指数
1
解决办法
3936
查看次数

添加使用具有多个条件的范围的自定义ransacker

我正在使用Ransack gem,我有一个模型,其范围如下:

scope :by_attr, ->(attr) {
  case attr
  when val1
    query1
  when val2
    query2
  else
    all
  end
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚,我怎么能写一个使用这个范围的ransacker.例如,我想要这种行为:

MyModel.search(by_attr: val1) # should return MyModel.query1
MyModel.search(by_attr: val2) # should return MyModel.query2
Run Code Online (Sandbox Code Playgroud)

有人对此有一些想法吗?

ruby-on-rails ransack

3
推荐指数
1
解决办法
2042
查看次数

标签 统计

elasticsearch ×1

lucene ×1

ransack ×1

ruby-on-rails ×1