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

Ajax 如何生成非前缀自动完成建议?,ajax,autocomplete,solr,jquery-autocomplete,Ajax,Autocomplete,Solr,Jquery Autocomplete,我想将自动完成添加到我的标记功能中 有几个问题: 如何生成包含前缀和字符串中间匹配项的自动完成建议列表?例如,如果用户键入“auto”,则自动完成建议应包括“autocomplete”和“buildautomation”等术语 我希望允许多单词标记,并使用逗号(“,”)作为标记的分隔符。因此,当用户点击空格键时,他仍然在键入相同的标记,但当他点击逗号键时,他开始了一个新的标记。我该怎么做 我正在使用Django、jQuery、MySQL和Solr。实现上述两个功能的最佳方法是什么 使用。使用查看

我想将自动完成添加到我的标记功能中

有几个问题:

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

  • 我希望允许多单词标记,并使用逗号(“,”)作为标记的分隔符。因此,当用户点击空格键时,他仍然在键入相同的标记,但当他点击逗号键时,他开始了一个新的标记。我该怎么做

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

  • 使用。使用查看它是如何工作的。另请参见(但您将使用NGram而不是EdgeGram)
  • 不确定“tags”是什么意思,但我猜您有一个多值字段“tags”,因此您的代码将在将数据发送到Solr之前解析输入(以“,”分隔)
  • 使用。使用查看它是如何工作的。另请参见(但您将使用NGram而不是EdgeGram)
  • 不确定“tags”是什么意思,但我猜您有一个多值字段“tags”,因此您的代码将在将数据发送到Solr之前解析输入(以“,”分隔)

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

    • 在结果列表摘要中突出显示不起作用,建议的解决方法在这种特殊情况下也不起作用
    • 如果您的文档标题很长,并且在显示时将其截断,则有可能与未显示的单词的前缀匹配。当然有几种处理方法
    • 在未来的版本中,我希望标题开头的文字比结尾的文字更重要一些。这将是缓解前一项问题的一种方法
    像前面的答案一样,我将从上面链接的同一篇文章开始,但您确实需要Edge NGram analyzer。您将添加的内容还包括空格标记化

    然后对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" />
    
    
    
    对于模式来说,这差不多就是它。记住:

    • 当您进行常规搜索时,您仍然会根据常规标题字段进行搜索
    • 进行自动完成搜索时,请根据前缀\u标题进行搜索

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

    • 在结果列表摘要中突出显示不起作用,建议的解决方法在这种特殊情况下也不起作用
    • 如果您的文档标题很长,并且在显示时将其截断,则有可能与未显示的单词的前缀匹配。当然有几种处理方法
    • 在未来的版本中,我希望标题开头的文字比结尾的文字更重要一些。这将是缓解前一项问题的一种方法
    像前面的答案一样,我将从上面链接的同一篇文章开始,但您确实需要Edge NGram analyzer。您将添加的内容还包括空格标记化

    然后对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" />
    
    
    
    对于模式来说,这差不多就是它。记住:

    • 当您进行常规搜索时,您仍然会根据常规标题字段进行搜索
    • 进行自动完成搜索时,请根据前缀\u标题进行搜索