Ruby on rails 太阳黑子-Solr Admin返回“太阳黑子”的结果-1“;但太阳黑子宝石并没有

Ruby on rails 太阳黑子-Solr Admin返回“太阳黑子”的结果-1“;但太阳黑子宝石并没有,ruby-on-rails,solr,sunspot,Ruby On Rails,Solr,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="ind

我在一个站点上部署了太阳黑子/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"/>
因此,如果我使用SOLR管理控制台并搜索“-1”,我会返回结果。在分析器中,我确认“-1”是一个gram,搜索查询“-1”匹配它和“0-1”

但是,当我在我的网站上执行此搜索时,它失败了。如果我搜索“0-1”,我会得到结果,但如果它只是“-1”,它什么也不会给我。我试着用“-1”来逃避它,但这并没有改变结果

在工作太阳黑子和不工作太阳黑子之间,我还能排除什么故障

在我的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: } ]
项目显示零件号是零件号的数组。模式可以是数字、带-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>

第1365组
团体
ActiveRecord::Base
团体
重型铜钟
不适用
455880-1
不适用

您正在使用DismaxQueryParser。如果查询以连字符开头,则以下文本将被解释为禁止()。
DismaxQueryParser支持短语搜索

解决方案可以是调整solr参数:

 @search = Sunspot.search(Group) do
   adjust_solr_params do |params|
    params[:q] = "\"#{params[:q]}\"" if params[:q].start_with?("-")
   end      
   fulltext params[:search_string]
   paginate(:page => params[:page], :per_page => params[:per_page] || 20)
 end

这看起来像是一个肮脏的黑客攻击-但它可以工作…

请您从schema.xml中添加您的模型代码、搜索方法和相关字段、dynamicField和copyField声明?已添加。我没有copyField,也不知道你所说的相关字段是什么意思。
<?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>
 @search = Sunspot.search(Group) do
   adjust_solr_params do |params|
    params[:q] = "\"#{params[:q]}\"" if params[:q].start_with?("-")
   end      
   fulltext params[:search_string]
   paginate(:page => params[:page], :per_page => params[:per_page] || 20)
 end