我无法理解使用轮胎宝石的弹性搜索中的分析器概念.我实际上是这些搜索概念的新手.有人可以在这里帮我一些参考文章或解释分析器实际上做了什么以及为什么使用它们?
我看到弹性搜索中提到了不同的分析器,如关键字,标准,简单,滚雪球.没有分析仪的知识,我无法弄清楚究竟是什么符合我的需要.
我想知道在使用ElasticSearch和Tire时如何在应用程序中测试搜索.
您如何设置新的ElasticSearch测试实例?有没有办法嘲笑它?
你知道的任何宝石可能对此有所帮助吗?
我发现一些有用的东西:
我发现了一篇很棒的文章回答了我所有的问题:)
http://bitsandbit.es/post/11295134047/unit-testing-with-tire-and-elastic-search#disqus_thread
此外,还有来自轮胎作者卡米的答案.
这也很有用:https://github.com/karmi/tire/wiki/Integration-Testing-Rails-Models-with-Tire
在问之前我无法相信我没有找到这些......
我正在使用ElasticSearch with Tire来索引和搜索一些ActiveRecord模型,我一直在寻找索引和搜索关联的"正确"方法.我还没有找到对此最好的做法,所以我想问一下是否有人认为他们认为有效的做法.
作为一个示例设置(这是组成但说明了问题),让我们说我们有一本书,有章节.每本书都有一个标题和作者,以及一堆章节.每章都有文字.我们希望将书籍的字段和章节的文本编入索引,以便您可以按作者搜索书籍,也可以搜索包含特定词语的任何书籍.
class Book < ActiveRecord::Base
include Tire::Model::Search
include Tire::Model::Callbacks
has_many :chapters
mapping do
indexes :title, :analyzer => 'snowball', :boost => 100
indexes :author, :analyzer => 'snowball'
indexes :chapters, type: 'object', properties: {
chapter_text: { type: 'string', analyzer: 'snowball' }
}
end
end
class Chapter < ActiveRecord::Base
belongs_to :book
end
Run Code Online (Sandbox Code Playgroud)
那么我用以下搜索进行搜索:
s = Book.search do
query { string query_string }
end
Run Code Online (Sandbox Code Playgroud)
这不起作用,即使看起来索引应该这样做.如果相反我索引:
indexes :chapters, :as => 'chapters.map{|c| c.chapter_text}.join('|'), :analyzer => 'snowball'
Run Code Online (Sandbox Code Playgroud)
这使文本可搜索,但显然它不是一个很好的黑客,它失去了实际的相关对象.我尝试过各种搜索,例如:
s = Book.search do
query do …Run Code Online (Sandbox Code Playgroud) 我一直在使用elasticsearch作为我的Rails应用程序的搜索引擎,但由于我无法理解的原因,它已停止正常工作.当向elasticsearch服务器发出curl请求时,我收到503错误.
curl -XGET http://localhost:9200
{
"ok" : true,
"status" : 503,
"name" : "Killpower",
"version" : {
"number" : "0.90.3",
"build_hash" : "5c38d6076448b899d758f29443329571e2522410",
"build_timestamp" : "2013-08-06T13:18:31Z",
"build_snapshot" : false,
"lucene_version" : "4.4"
},
"tagline" : "You Know, for Search"
}
Run Code Online (Sandbox Code Playgroud)
我试图通过重新加载elasticsearch服务并安装新版本而没有任何成功来解决问题.
这是我在日志中发现的
[2013-09-03 12:31:45,320][INFO ][node ] [Killpower] version[0.90.3],
pid[4222], build[5c38d60/2013-08-06T13:18:31Z]
[2013-09-03 12:31:45,321][INFO ][node ] [Killpower] initializing ...
[2013-09-03 12:31:45,327][INFO ][plugins ] [Killpower] loaded [], sites []
[2013-09-03 12:31:47,248][INFO ][node ] [Killpower] initialized
[2013-09-03 12:31:47,248][INFO ][node ] [Killpower] starting ...
[2013-09-03 …Run Code Online (Sandbox Code Playgroud) 在阅读轮胎文档时,我的印象是你应该使用其中之一mapping或to_indexed_json方法,因为(我的理解是......)mapping用来喂养to_indexed_json.
问题是,我找到了一些使用它们的教程.为什么?
基本上,我的应用程序现在正在使用to_indexed_json但我无法弄清楚如何设置某些属性的提升值(因此我开始查看映射的原因),我想知道是否使用两者会产生一些冲突.
我希望能够将多字搜索与多个字段匹配,其中搜索的每个字都包含在任何字段中,任何组合中.我想避免使用 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) 所以我通过brew安装了elasticsearch:
$ brew install elasticsearch
Run Code Online (Sandbox Code Playgroud)
然后当我运行elasticsearch服务器时:
elasticsearch -f -D es.config=/usr/local/Cellar/elasticsearch/0.19.3/config/elasticsearch.yml
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
{0.20.4}: Setup Failed ...
- FailedToResolveConfigException[Failed to resolve config path [/usr/local/Cellar/elasticsearch/0.19.3/config/elasticsearch.yml], tried file path [/usr/local/Cellar/elasticsearch/0.19.3/config/elasticsearch.yml], path file [/usr/local/Cellar/elasticsearch/0.20.4/config/usr/local/Cellar/elasticsearch/0.19.3/config/elasticsearch.yml], and classpath]
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?任何想法都欢迎.
我这样做了,它对我有用:
获取包裹:
$ curl -k -L -o elasticsearch-0.20.2.tar.gz http://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-0.20.2.tar.gz
Run Code Online (Sandbox Code Playgroud)
Unzipp:
$ tar -zxvf elasticsearch-0.20.2.tar.gz
Run Code Online (Sandbox Code Playgroud)
运行elasticsearch服务器:
./elasticsearch-0.20.2/bin/elasticsearch -f
Run Code Online (Sandbox Code Playgroud) 我想过滤我的类的私有布尔值,所以它只显示非私有的资源,但它不适合我.(我极大地贬低了代码)
mapping do
indexes :private, type: "boolean"
indexes :name, type: "string"
end
end
def self.search(params)
tire.search(load: true, page: params[:page], per_page: 20) do
query { string params[:query] } if params[:query].present?
# So far I've tried...
# filter :bool, :private => ["false"]
# filter :bool, private: false
end
end
Run Code Online (Sandbox Code Playgroud)
我该怎么做呢?
我正在使用Tire和ActiveRecord为elasticsearch索引数据集.我有一个Artist模型,has_many:images.如何索引返回特定图像的Artist模型的方法?或者参考相关模型的方法?我想要的艺术家结果将包括与艺术家相关的主要图像的路径(原始图像和缩略图).
我试过这个映射:
mapping do
indexes :id, :index => :not_analyzed
indexes :name
indexes :url
indexes :primary_image_original
indexes :primary_image_thumbnail
end
Run Code Online (Sandbox Code Playgroud)
引用这些Artist方法:
def primary_image_original
return images.where(:priority => 'primary').first.original
end
def primary_image_thumbnail
return images.where(:priority => 'primary').first.thumbnail_150
end
Run Code Online (Sandbox Code Playgroud)
这只是忽略了索引方法.基于其他答案,如Elasticsearch,Tire和嵌套查询/与ActiveRecord的关联,我试过这个:
mapping do
indexes :id, :index => :not_analyzed
indexes :name
indexes :url
indexes :images do
indexes :original
indexes :thumbnail_150
indexes :priority
end
end
def to_indexed_json
to_json(include: { images: { only: [:original, :thumbnail_150, :priority] } } )
end
Run Code Online (Sandbox Code Playgroud)
但这也不会归还我所追求的.我花了几个小时谷歌搜索和阅读elasticsearch和Tire文档,并没有找到这个模式的工作示例.谢谢你的想法!
我在我的Ruby on Rails应用程序中使用elasticsearch.我想用char_filter用空格替换一些字符.
在elasticsearch教程中,它说:
"mappings" : ["ph=>f", "qu=>q"]
Run Code Online (Sandbox Code Playgroud)
我尝试过以下方法:
"mappings" : ["ph=>\s", "qu=>\s"]
Run Code Online (Sandbox Code Playgroud)
但它似乎不起作用.有什么想法吗?