我希望能够将多字搜索与多个字段匹配,其中搜索的每个字都包含在任何字段中,任何组合中.我想避免使用 query_string.
curl -X POST "http://localhost:9200/index/document/1" -d '{"id":1,"firstname":"john","middlename":"clark","lastname":"smith"}'
curl -X POST "http://localhost:9200/index/document/2" -d '{"id":2,"firstname":"john","middlename":"paladini","lastname":"miranda"}'
Run Code Online (Sandbox Code Playgroud)
我想搜索"John Smith"以仅匹配文档1.以下查询执行我需要的操作但我宁愿避免使用query_string以防用户传递"OR","AND"和任何其他高级参数.
curl -X GET 'http://localhost:9200/index/_search?per_page=10&pretty' -d '{
"query": {
"query_string": {
"query": "john smith",
"default_operator": "AND",
"fields": [
"firstname",
"lastname",
"middlename"
]
}
}
}'
Run Code Online (Sandbox Code Playgroud) 我希望能够按分数和位置订购我的搜索结果.数据库中的每个用户都有lat/lot,我目前正在编制索引:
location :coordinates do
Sunspot::Util::Coordinates.new latlon[0], latlon[1]
end
Run Code Online (Sandbox Code Playgroud)
我将执行搜索的模型也以相同的方式编入索引.基本上我想要实现的是结果按分数排序,然后按位置排序.因此,如果我搜索沃尔玛,我希望看到所有沃尔玛的地理位置靠近我的位置.
我记得读过关于solr的新geo-sort的东西,但不确定它是否超出alpha和/或sunspot是否实现了包装器.
你会推荐什么?
鉴于我想找到20个相关结果,我将如何提升any_of中的第一个条件(使用(:id).any_of(co_author_ids)),这样如果有20个符合所述条件的结果,它将返回而不是尝试根据第二个标准进行匹配?
@solr_search = User.solr_search do
paginate(:per_page => 20)
with(:has_email, true)
any_of do
with(:id).any_of(co_author_ids)
with(:hospitals_id).any_of(hopital_ids)
end
end
Run Code Online (Sandbox Code Playgroud)
最初我并不认为增强是必要的,因为我认为any_of会产生级联效应,但它看起来并不像那样.我知道在查询关键字和全文搜索时会对查询时间进行提升,但是无法使用with()方法.
我在 EC2 单服务器设置上使用 Rails、Tire 和 Elasticsearch,没有分片或复制(这是 Jenkins CI 服务器)。使用自定义初始值设定项:
analysis:
filter:
name_synonyms:
type: synonym
synonyms_path: <%= Rails.root.join("config", "synonyms", "name_synonyms.txt") %>
Run Code Online (Sandbox Code Playgroud)
该文件通过 Erubis 运行,同义词路径转换为如下所示:
/root/workspace/project-project-0f317744a1870b4baf61bbaeb390ebe1/config/synonyms/term_synonyms.txt
Run Code Online (Sandbox Code Playgroud)
当我列出服务器中的文件时,我看到以下内容:
root@ip-XX-XXX-XX-XXX:~/workspace/project-project-0f317744a1870b4baf61bbaeb390ebe1/config/synonyms# ls -la
total 20
drwxr-xr-x 2 root root 4096 Feb 11 18:25 .
drwxr-xr-x 7 root root 4096 Feb 11 18:25 ..
-rw-r--r-- 1 root root 3117 Feb 11 18:25 location_synonyms.txt
-rw-r--r-- 1 root root 3999 Feb 11 18:25 name_synonyms.txt
-rw-r--r-- 1 root root 2144 Feb 11 18:25 term_synonyms.txt
Run Code Online (Sandbox Code Playgroud)
这正是我所期待的,但是我在运行时看到以下错误 rake spec
500 : …Run Code Online (Sandbox Code Playgroud) 给定以下索引,如何在嵌套数组中选择适当的项并访问其中一个值?这里的目的是在里面的值里面使用它script_score.
# Create mapping
curl -XPUT localhost:9200/test/user/_mapping -d '
{
"user" : {
"properties" : {
"name" : {
"type" : "string"
},
"skills" : {
"type": "nested",
"properties" : {
"skill_id" : {
"type" : "integer"
},
"recommendations_count" : {
"type" : "integer"
}
}
}
}
}
}
'
# Indexing Data
curl -XPUT localhost:9200/test/user/1 -d '
{
"name": "John",
"skills": [
{
"skill_id": 100,
"recommendations_count": 5
},
{
"skill_id": 200,
"recommendations_count": 3
}
]
} …Run Code Online (Sandbox Code Playgroud) 我为 Rails 创建了一个自定义中间件,它将拦截所有请求并确保它来自授权的 IP,否则它应该提示输入基本的 http 身份验证用户/名密码。
目前看起来是这样的:
require 'net/http'
class AuthorizeEnvironment
def initialize(app)
@app = app
end
def call(env)
if AppConstants.approved_doximity_ips.include?(env["REMOTE_ADDR"])
@app.call(env)
elsif authorized?(env)
@app.call(env)
else
[403, {"Content-Type" => "text/html"}, ["Not Authorized on this environment."]]
end
end
def authorized?(env)
@auth ||= Rack::Auth::Basic::Request.new(env)
@auth.provided? && @auth.basic? && @auth.credentials && @auth.credentials == ['username', 'password']
end
end
Run Code Online (Sandbox Code Playgroud)
这段代码的问题是我似乎无法找到一种方法来触发浏览器上的 http 身份验证窗口。我查看了此内容,但没有看到任何明显的迹象表明这是如何完成的。
你能指出我正确的方向吗?