0

我想为我的标记功能添加自动完成功能。

几个问题:

  1. 如何生成包含前缀和字符串中间匹配项的自动完成建议列表?例如,如果用户键入“auto”,则自动完成建议应包括“自动完成”和“构建自动化”等术语。

  2. 我想允许多词标签并使用逗号(“,”)作为标签的分隔符。所以当用户按下空格键时,他仍然在输入相同的标签,但是当他按下逗号键时,他正在开始一个新的标签。我怎么做?

我正在使用 Django、jQuery、MySQL 和 Solr。实现上述 2 个功能的最佳方法是什么?

4

2 回答 2

2
  1. 使用NGramTokenizerFactory。使用分析控制台查看它是如何工作的。另请参阅这篇文章(但您将使用 NGram 而不是 EdgeNGram)。
  2. 不确定您所说的“标签”是什么意思,但我猜您有一个多值字段“标签”,因此您的代码会在将数据发送到 Solr 之前解析输入(由“,”分割)。
于 2010-06-19T16:42:15.343 回答
2

我已经完全实现了您的要求,并且效果很好。有两个问题需要注意:

  • 在结果列表摘要中突出显示不起作用,并且建议的解决方法在这种特殊情况下也不起作用。
  • 如果您的文档有长标题并在显示时将其截断,则您可能会匹配未显示的单词的前缀。当然有几种方法可以处理这个问题。
  • 在未来的版本中,我想让标题开头的单词比结尾的单词更重要。这将是减轻前一项的一种方法。

与前面的答案一样,我将从上面链接的同一篇文章开始,但您确实需要 Edge NGram 分析器。您要添加的内容是还进行空白标记化。

然后您将对 schema.xml 文件进行这些更改。此示例假设您已经定义了一个名为“title”的字段,并且它也是您想要显示的内容。我创建了第二个字段,它仅用于自动完成前缀匹配。

第 1 步:定义 Edge NGram 文本字段类型

<types>
  <!-- ... other types ... -->

  <!-- Assuming you already have this -->
  <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
    ... normal text definition ...
  </fieldType>

  <!-- Adding this -->
  <fieldType name="prefix_edge_text" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <!-- not using enablePositionIncrements="true" for now -->
      <filter class="solr.StopFilterFactory" words="stopwords.txt" />
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="25" />
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <!-- No need to create Edges here -->
      <!-- Don't want stopwords here -->
    </analyzer>
  </fieldType>

</types>

第 2 步:定义新字段

<fields>
  <!-- ... other fields ... -->

  <!-- Assuming you already have this -->
  <field name="title" type="text" indexed="true" stored="true" multiValued="true"/>

  <!-- Adding this -->
  <field name="prefix_title" type="prefix_edge_text" indexed="true" stored="true" multiValued="true" />

</fields>

第 3 步:在索引期间将标题的内容复制到前缀字段

<!-- Adding this -->
<copyField source="title" dest="prefix_title" />

架构就差不多了。只要记住:

  • 当您进行常规搜索时,您仍会针对常规标题字段进行搜索。
  • 当您进行自动完成搜索时,请针对prefix_title进行搜索。
于 2011-01-19T01:33:49.220 回答