【发布时间】:2025-11-23 01:20:03
【问题描述】:
我在网站上部署了 Sunspot/Solr 进行搜索。我想在零件号上进行部分搜索,连字符最多两个字符。
我目前的版本是:
Solr & Lucense 3.5
sunspot (2.0.0)
sunspot_rails (2.0.0)
sunspot_solr (2.0.0)
我的配置文件:
<fieldType name="n_gram_text" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.WordDelimiterFilterFactory" preserveOriginal="1"/>
</analyzer>
</fieldType>
<dynamicField name="*_ngram" stored="false" type="n_gram_text" multiValued="true" indexed="true"/>
样品部件号:
455880-1
因此,如果我使用 SOLR 管理控制台并搜索“-1”,我会返回结果。在分析器中,我确认“-1”是一个克,并且搜索查询“-1”与它和“0-1”匹配。
但是当我在我的网站中执行此搜索时,它会失败。如果我搜索“0-1”,我会得到结果,但如果它只是“-1”,它什么也没给我。我试过用“-1”转义它,但这不会改变结果。
在工作的 Solr 和不工作的 Sunspot 之间我还能解决什么问题?
在我的 Rails 日志中,我有以下内容:
SOLR Request (7.5ms) [ path=#<RSolr::Client:0x000001081efe70>
parameters={data:
fq=type%3AGroup
&fq=is_site_b%3Atrue
&q=-1
&fl=%2A+score
&qf=name_text+display_ngram
&defType=dismax
&start=0
&rows=20,
method: post,
params: {:wt=>:ruby},
query: wt=ruby,
headers: {"Content-Type"=>"application/x-www-form-urlencoded; charset=UTF-8"}, path: select, uri: http://localhost:8984/solr/select?wt=ruby, open_timeout: , read_timeout: , retry_503: , retry_after_limit: } ]
模型设置:
searchable do
text :name
text :item_display_part_numbers, :as => :display_ngram
end
def item_display_part_numbers
self.items.map(&:display_part_number)
end
item_display_part_numbers 是一个零件编号数组。模式可以是数字、带 -1 的数字或文本“n/a”。
搜索:
@search = Sunspot.search(Group) do
fulltext params[:search_string]
paginate(:page => params[:page], :per_page => params[:per_page] || 20)
end
我相信这个数据对象的索引是正确的。在控制台中,如果我检索它并调用它的 Index 方法,我会得到以下信息:
<?xml version="1.0" encoding="UTF-8"?>
<add>
<doc>
<field name="id">Group 1365</field>
<field name="type">Group</field>
<field name="type">ActiveRecord::Base</field>
<field name="class_name">Group</field>
<field name="name_text">HEAVY DUTY BRASS BELL</field>
<field name="display_ngram">n/a</field>
<field name="display_ngram">455880-1</field>
<field name="display_ngram">n/a</field>
</doc>
</add>
【问题讨论】:
-
能否请您在 schema.xml 中添加您的模型代码、搜索方法和相关字段、dynamicField 和 copyField 声明?
-
已添加。我没有 copyField,不确定您所说的相关字段是什么意思。
标签: ruby-on-rails solr sunspot