【问题标题】:Solr "starts with" and "phrase" indexSolr“开始于”和“短语”索引
【发布时间】:2013-01-14 20:59:33
【问题描述】:

我正在尝试创建一个索引,该索引允许我基于“开始于”对单个单词和部分短语进行查询。

例如,给定文本“blah blah stuff couple blue drums blah more blah”(注意这基本上是使用复制字段对记录进行全文搜索),我希望能够匹配以下内容:

  • 情侣
  • 情侣蓝
  • 情侣蓝
  • 蓝鼓
  • 蓝药

它不应该匹配“一对鼓”的查询。

我尝试使用“text_general”类型,但它不执行部分单词查询,例如“cou”。

<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <!-- in this example, we will only use synonyms at query time
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
    -->
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

我还尝试了一个边缘 ngram 过滤器,但它并没有按照我的需要做短语,例如,带有 text:'couple drums' 的查询返回带有“情侣”或“鼓”的结果。

<fieldType name="fulltext2" class="solr.TextField" positionIncrementGap="100">
  <analyzer type="index">
    <tokenizer class="solr.LowerCaseTokenizerFactory"/>
    <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="30" side="front"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.LowerCaseTokenizerFactory"/>
  </analyzer>
</fieldType>

是否有分词器和过滤器的组合可以完成我想要做的事情?

【问题讨论】:

  • 我刚刚发现使用 text_general fieldType,我可以对单个单词进行通配符,对多个单词进行短语查询。现在这可能是“短语查询中的通配符”问题。我正在为 Solr 4.0 研究这个。相关:stackoverflow.com/questions/1088558/lucene-wildcards-in-phrases
  • 你能在这里发表你的答案吗:stackoverflow.com/questions/20142716/…我几乎同样的问题,提前谢谢
  • @rodi 听起来我们确实遇到了类似的问题,但不幸的是我从未找到可接受的解决方案。我们最终更改了要求以匹配 Solr 的可能性。 :(
  • 现在我决定拆分短语并将其与“?”连接,所以“我的长短语是verycomplexxxxx”-> text:my?long?phrase?is?veryco* 并且它匹配.你怎么看?

标签: solr indexing


【解决方案1】:

如果您的输入实际上是一个短语,那么使用 Lucene 的短语搜索将排除像 couple drums 之类的查询(除非您的输入包含“couple drums”作为短语)。

您可能还想查看Stupid Lucene Tricks: Exact Match, Starts With, Ends With

【讨论】:

  • 感谢马克的信息。不幸的是,我的意思是在全文字段中以任何给定单词开头。我在原始问题中添加了更多信息,以阐明我在寻找什么。
【解决方案2】:

我认为您需要使用 Expose SpanFirst in eDismax 补丁构建 solr-core。

【讨论】:

    猜你喜欢
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    相关资源
    最近更新 更多