如何生成非前缀自动完成建议?

时间:2010-06-19 01:48:53

标签: ajax autocomplete solr jquery-autocomplete

我想为自己的标记功能添加自动填充功能。

几个问题:

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

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

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

2 个答案:

答案 0 :(得分:2)

  1. 使用NGramTokenizerFactory。使用analysis console查看其工作原理。另请参阅this article(但您将使用NGram而不是EdgeNGram)。
  2. 不确定“标签”是什么意思,但我想你有一个多值字段“标签”,所以你的代码会在将数据发送给Solr之前解析输入(用“,”拆分)。

答案 1 :(得分:2)

我已经完全按照您的要求实施了它,并且效果非常好。有两个问题需要注意:

  • 结果列表摘要中的突出显示不起作用,建议的解决方法在此特定情况下也不起作用。
  • 如果您的文档有长标题并在显示时截断它们,则您可能会匹配未显示的单词的前缀。当然有几种方法可以解决这个问题。
  • 在未来的版本中,我想在标题的开头给出更多的重要信息,然后再说出最后的文字。这将是缓解上一项的一种方法。

与上一个答案一样,我从上面链接的同一篇文章开始,但你想要Edge NGram分析器。你要添加的东西也是做空格标记化。

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

步骤1:定义边缘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