ApacheSolr搜索:返回查询作为字段一部分的结果

ApacheSolr搜索:返回查询作为字段一部分的结果,solr,Solr,我在“大括号”上搜索,希望返回3个结果(见文章底部)。然而,我只得到“大括号”是一个单独的关键字而不是关键字的一部分的结果。 我想指定一个权重,精确单词的权重最大,然后在搜索字符串是另一个单词的一部分的位置分配一个较轻的权重 我试过: title_search_global:"brace"^100 title_search_global:*"brace"^100 title_search_global:"*brace*"^100 但这些都不管用 查询: http://localho

我在“大括号”上搜索,希望返回3个结果(见文章底部)。然而,我只得到“大括号”是一个单独的关键字而不是关键字的一部分的结果。 我想指定一个权重,精确单词的权重最大,然后在搜索字符串是另一个单词的一部分的位置分配一个较轻的权重

我试过:

title_search_global:"brace"^100  
title_search_global:*"brace"^100  
title_search_global:"*brace*"^100  
但这些都不管用

查询:

http://localhost:8983/solr/test/select/?indent=on&facet=true&wt=json&sort=clickcount%20desc&start=0&rows=9&fl=id,title&q=(title_search_global:(brace)%20OR%20title_search_global:%22brace%22^100))
返回:

{
  "responseHeader":{
    "status":0,
    "QTime":1,
    "params":{
      "q":"(title_search_global:(brace) OR title_search_global:\"brace\"^100))",
      "indent":"on",
      "fl":"id,title",
      "start":"0",
      "sort":"clickcount desc",
      "rows":"9",
      "facet":"true",
      "wt":"json"}},
  "response":{"numFound":2,"start":0,"docs":[
      {
        "title":"feet brace",
        "id":"3216741"},
      {
        "title":"Braun blood pressure scan",
        "id":"3216742"}]
  },
  "facet_counts":{
    "facet_queries":{},
    "facet_fields":{},
    "facet_dates":{},
    "facet_ranges":{}}}
schema.xml

<!-- for global search -->
<fieldType name="searchtext" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>       
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>         
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" side="front" /> 
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>   
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>                 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="20" side="front" /> 
  </analyzer>
</fieldType>            

<fieldType name="exactmatch" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>       
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>         
    <filter class="solr.LowerCaseFilterFactory"/> 
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>   
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>                 
    <filter class="solr.LowerCaseFilterFactory"/>     
  </analyzer>
</fieldType>

<field name="title" type="string" indexed="true" stored="true"/>
<field name="title_search_global" type="searchtext" indexed="true" stored="true"/>
<field name="exactmatch" type="exactmatch" indexed="true" stored="true"/>

<copyField source="title" dest="exactmatch"/>
<copyField source="title" dest="title_search_global"/>  
要获取所有“大括号”匹配,请使用
NGramFilterFactory
而不是
EdgeNGramFilterFactory

我不知道有什么直接的方法可以提高精确匹配,但从邮件列表帖子中可以看出,您可以创建一个副本字段,只需简单的标记和大多数单词定界,就可以获得精确的单词,然后在该字段上大幅度提高

这可能看起来像:

<fieldType name="exactmatch" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>       
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>         
    <filter class="solr.LowerCaseFilterFactory"/> 
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>   
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>                 
    <filter class="solr.LowerCaseFilterFactory"/>     
  </analyzer>
</fieldType>


然后使用
?q=“brace”&qf=searchtext+exactmatch^1000进行查询

尝试使用
NGramFilterFactory
而不是
EdgeNGramFilterFactory
谢谢,我现在得到了所有匹配结果:),但我如何分配权重以确保搜索查询中的精确匹配比部分匹配更重要?e、 g.有“brace”的结果比只有“bra”的结果更重要(在我的示例中,如结果“Braun”),请参阅我的回答谢谢。我更新了我的帖子。但是,这两个查询仍然返回Braun产品作为第二个结果,我希望它是第三个结果。可以肯定的是:产品1和3都是完全匹配的,对吗?还是仅仅是产品1?我尝试过的查询:
&q=brace&qf=title\u search\u global+exactmatch^1000
&q=title\u search\u global:(brace)&qf=title\u search\u global+exactmatch^1000
附加
&debugQuery=true
并发布调试输出。这应该告诉我们为什么会出现“Braun”。您实现了一些自定义排序逻辑吗?根据您的调试输出,
id:3216743
title:Super Ortho Kneebrake的分数大于
id:3216742
title:Braun血压扫描的分数,因此应显示在Braun上方。尝试将
&sort=score desc
附加到查询和检查中。
<fieldType name="exactmatch" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>       
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>         
    <filter class="solr.LowerCaseFilterFactory"/> 
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>   
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>                 
    <filter class="solr.LowerCaseFilterFactory"/>     
  </analyzer>
</fieldType>