Solr无法正确搜索多值字段

时间:2017-01-25 11:22:04

标签: search solr lucene

我们有一个SOLR v.5.5.0服务器,我们已经加载了文档。每个SOLR字段都复制到我们要搜索的复合字段中。

例如,在我们的架构中,我们有:

<field name="Key" type="int" indexed="true" stored="true" required="true"/>
<field name="_version_" type="string" indexed="true" stored="true" multiValued="false"/>
<field name="Name" type="text_suggest_ngram" indexed="true" stored="true" required="false"/>
<field name="EmailAddress" type="text_email" indexed="true" stored="true" required="false"/>
<field name="Indexing" type="text_suggest_ngram" indexed="true" stored="true" multiValued="true"/>

大约有20个不同的领域。每个字段都复制到索引中:

<copyField source="Key" dest="Indexing"/>
<copyField source="Name" dest="Indexing"/>
<copyField source="EmailAddress" dest="Indexing"/>

自定义字段类型具有以下标记器:

<fieldType name="text_email" class="solr.TextField"/>

<fieldType name="text_suggest_ngram" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
            <filter class="solr.EdgeNGramFilterFactory" maxGramSize="20" minGramSize="2"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.UAX29URLEmailTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            <filter class="solr.ASCIIFoldingFilterFactory"/>
            <filter class="solr.EnglishPossessiveFilterFactory"/>
        </analyzer>
</fieldType>

因此,索引字段变为多值字段。我们使用此字段进行搜索,因为我们应该能够在所有字段中搜索一般搜索功能。

当我们将数据导入SOLR然后进行搜索时,一些记录按预期工作。例如,如果我们搜索电子邮件地址(例如select?q=Indexing%3Asomeone%40example.com),则SOLR会提供正确的文档。

但是,在其他文档中,SOLR在搜索时提供0结果(尤其是电子邮件地址)。我们看到的是搜索secondexample@example.com SOLR找不到任何文档,但将查询更改为secondexample SOLR会找到该文档。将查询更改为secondexample@e SOLR找不到任何文档。如果我们针对字段EmailAddressselect?q=EmailAddress%3Asecondexample%40example.com)进行字段搜索,则搜索会按预期成功。

我们不希望对特定命名字段的搜索进行编码,因为字段名称可能会发生变化,并且每次都不希望更改我们的搜索服务。

无论如何都要找出为什么SOLR没有正确搜索多值字段?

更新 示例JSON文档(内容模糊以确保安全性)“

{
    "Phone": "555",
    "IndexText": [
        "555",
        "7854",
        "",
        "Main App",
        "16",
        "Life MTG L",
        "New MTG LL",
        "Application",
        "574",
        "574",
        "secondexample@example.com",
        "",
        "",
        "M M S N",
        "Open",
        "P",
        "3876 K E 4 O N W 2619 S B",
        "",
        "A",
        "6055 C P E 32 L S C P B G 1501 S B",
        "S I N",
        "1597456 1254735"
    ],
    "Id": "7854",
    "Name": "Open",
    "WP": "",
    "OK": "16",
    "HP": "574",
    "LK": 1048808,
    "FN": "",
    "PN": "",
    "TN": "",
    "FN2": "MS",
    "LN2": "M M S N",
    "CL": "2",
    "Type": "P",
    "Laddr": "3876 K E 4 O N W 2619 S B",
    "EmailAddress": "secondexample@example.com",
    "LES": "A",
    "PA": "6055 C P E 32 L S C P B G 1501 S B",
    "LIT": "S I N",
    "S": "N",
    "Acc": "1597456 1254735",
    "_version_": "1557490405902123010",
    "score": 11.771251
}

字段和内容已根据实际数据进行了编辑,但它提供了这个想法。字段名称和内容是较长的单词。这取自SOLR管理员搜索界面。

1 个答案:

答案 0 :(得分:0)

好的 - 所以我们的配置似乎有两个错误。

  1. EdgeNGramFilterFactory上的Gram大小为
  2. 正如@femtoRgon指出的那样,克大小不正确。增加克大小然后正确地修复完整的电子邮件地址搜索。如果我们搜索完整的电子邮件地址,Solr现在可以正确找到该文档。

    1. 部分电子邮件地址上的电子邮件令牌不正确
    2. solr.UAX29URLEmailTokenizerFactory未在Solr 5.5.0上正确标记部分电子邮件地址。在查询secondexample@e上使用Solr查询分析器时:

      UAXURLET
      text                        secondexample                               e
      raw_bytes                   [73 65 63 6f 6e 64 65 78 61 6d 70 6c 65]    [65]
      start                       0                                           14
      end                         13                                          15
      positionLength              1                                           1
      type                        <ALPHANUM>                                  <ALPHANUM>
      position                    1                                           1
      

      即使这是一个电子邮件地址,令牌系统也会生成<ALPHANUM>类型,而不是<EMAIL>类型。

      看到我们的要求是前缀搜索,将标记生成器更改为KeywordTokenizerFactory意味着我们现在获取完整关键字以进行前缀匹配。

      另一方面,当涉及到这些事情时,Solr Admin Query分析器非常强大(使用新的东西)。