2017-01-25 96 views
0

我們有一個SOLR v.5.5.0服務器,我們已經加載了文檔。每個SOLR字段都被複制到我們想要搜索的複合字段中。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"/> 

自定義字段類型被給出的以下tokenisers:

<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個結果。我們看到的是搜索[email protected] SOLR找不到文檔,但將查詢更改爲secondexample SOLR查找文檔。將查詢更改爲[email protected] 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", 
     "[email protected]", 
     "", 
     "", 
     "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": "[email protected]", 
    "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管理搜索界面採取

+0

看起來奇怪,你可以顯示樣品文件? – Mysterion

+0

注意, 「[email protected]」 是*長於你的'maxGramSize' *。 – femtoRgon

+1

@Mysterion - 增加了一個示例文檔。這些文件包含個人信息,因此無法發佈真實數據。 – user626201

回答

0

好了 - 這樣似乎有兩大誤區與我們的配置

    。在EdgeNGramFilterFactory
  1. 革蘭氏規模小

由於@femtoRgon指出,克大小不正確。增加克的大小,然後修正完整的電子郵件地址搜索正確。如果我們搜索完整的電子郵件地址,Solr現在可以正確查找文檔。

部分上的電子郵件地址

的solr.UAX29URLEmailTokenizerFactory不正確地標記化上Solr的5.5.0部分電子郵件地址

  • 不正確電子郵件令牌。當使用該查詢[email protected] 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 
    

    即使這是一個電子郵件地址標記生成器生成<EMAIL><ALPHANUM>類型,而不是類型。

    看到我們的要求是前綴搜索,改變標記生成器來KeywordTokenizerFactory意味着我們現在獲得完整的關鍵字做前綴匹配上。

    在一個側面說明,Solr的管理員查詢分析器是相當強大的使用(學到新的東西),當涉及到這些東西。