2017-10-25 42 views
0

私はここで何が起こっているのか把握しようとしていますが、これまでは空になっています。私は誰かが私が解決策を探すことができる場所について私に指導を提供できることを望んでいる。/ Solr:ワイルドカードと大文字と小文字の区別の検索

<fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
    <analyzer type="index"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <!-- in this example, we will only use synonyms at query time 
    <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/> 
    --> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="0"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.WhitespaceTokenizerFactory"/> 
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
    <filter class="solr.StopFilterFactory" 
      ignoreCase="true" 
      words="stopwords.txt" 
      /> 
    <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="0"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/> 
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
    </analyzer> 
</fieldType> 

は、私は次のキーを持っているいくつかのレコードを持って、私はこれらのレコードを返すためのSolrを取得するために、さまざまな検索をしようとしている

"text":[ 
    "NOFX_SiteTest_4", 
    "NOFX_SiteTest_4\nNOFX_SiteTest_4\n Fourteen\n Ten\n Thirteen\n Fifteen\n Two\n 3\n Select Fields" 
] 


"text":[ 
    "NOFX_SiteTest_44", 
    "NOFX_SiteTest_44\nNOFX_SiteTest_44\n Fourteen\n Ten\n Thirteen\n Fifteen\n Two\n 3\n Select Fields" 
] 


"text":[ 
    "NOFX_SiteTest_445", 
    "NOFX_SiteTest_445\nNOFX_SiteTest_445\n Fourteen\n Ten\n Thirteen\n Fifteen\n Two\n 3\n Select Fields" 
] 

値:私はそのように定義されたテキストフィールドを持っています。問題は、(ワイルドカードを追加する場所と、ワイルドカードを追加する場所と、アンダースコアに関する検索テキストを残す場所に基づいて)クエリをどのように構造化するかによって、予期せぬ、間違った結果が得られます。ここで私はSolrの管理クエリページから走った検索は、次のとおりです。

SEARCH 
text:((NOFX_SiteTest_4*)) OR text_exact:((NOFX_SiteTest_4*)) 

RESULT 
3 Records (correct) 

SEARCH 
text:((NOFX_SiteTest_)) OR text_exact:((NOFX_SiteTest_)) 

RESULT 
3 Records (correct) 

SEARCH 
text:((NOFX_SiteTest)) OR text_exact:((NOFX_SiteTest)) 

RESULT 
3 Records (correct) 

SEARCH 
text:((NOFX_SiteTest*)) OR text_exact:((NOFX_SiteTest*)) 

RESULT 
3 Records (correct) 

SEARCH 
text:((nofx_sitetest_4)) OR text_exact:((nofx_sitetest_4)) 

RESULT 
1 Record (correct) 

SEARCH 
text:((nofx_sitetest_4*)) OR text_exact:((nofx_sitetest_4*)) 

RESULT 
0 Records (incorrect) 

SEARCH 
text:((nofx_sitetest_)) OR text_exact:((nofx_sitetest_)) 

RESULT 
3 Records (correct) 

SEARCH 
text:((nofx_sitetest*)) OR text_exact:((nofx_sitetest*)) 

RESULT 
0 Records (incorrect) 

それは私には思われるものから、このフィールドの設定に基づいて、Solrには同じように、これら2つのクエリを見てする必要があります。

text:((NOFX_SiteTest_4*)) OR text_exact:((NOFX_SiteTest_4*)) 

text:((nofx_sitetest_4*)) OR text_exact:((nofx_sitetest_4*)) 

なぜそれが文字が適切に計上される最初の検索では、レコードの適切な数が返された場合、それがすべてだ2回目の探索であり、小文字ではありません。これらのクエリの実行時にはまだ、:

text:((NOFX_SiteTest_)) OR text_exact:((NOFX_SiteTest_)) 

text:((nofx_sitetest_)) OR text_exact:((nofx_sitetest_)) 

をレコードの適切な数が返されます。ワイルドカードを含めると、問題が発生するのはなぜですか?特に、検索が完全に小文字で構成されている場合は?

誰かが私を正しい方向に向けることを望んでいます。私はドキュメントを探して、同様の問題を検索してきましたが、私が問題を解決するのに役立つとは思えません。

EDIT:いくつかの追加情報ここで

は、私は上記の私の検索で使用している二つのフィールドの定義です:

<field name="text"  type="text"  indexed="true" stored="true" multiValued="true"/> 
<field name="text_exact" type="text_exact" indexed="false" stored="false" multiValued="true"/> 

<!-- copy all fields to the default search field --> 
<copyField source="title" dest="text"/> 
<copyField source="content" dest="text"/> 
<copyField source="Comment" dest="text"/> 

<!-- copy all fields to the exact match search field --> 
<copyField source="title" dest="text_exact"/> 
<copyField source="content" dest="text_exact"/> 
<copyField source="Comment" dest="text_exact"/> 

texttext_exactの唯一の違いは、フィールドタイプが定義されている方法です。私の検索が

text:((NOFX_SiteTest_4*)) OR text_exact:((NOFX_SiteTest_4*)) 

である場合には(私は上記の状態として)それは3つのレコードを検索しますが、それはとてもためtext_exactフィールド、ないtextフィールドで行います。私はそれが奇妙だと分かった検索を実行する

text_exact:((NOFX_SiteTest_4*)) 

戻り3、レコードが、検索に

text:((NOFX_SiteTest_4*)) 

戻り0レコードを実行しています。私はtext_exactがデータを返す理由を見ることができます。 text_exactフィールドに正確なテキストがあるためです。しかし、なぜtextに対する検索でレコードが得られないのか分かりません。そのフィールドはもう少し開放的で寛大ではありませんか?ワイルドカード検索をさらに許可できますか?アスタリスクを削除すると、正確なテキストがtextフィールドにあるレコードが返されるためです。アスタリスクをワイルドカードとして使用していないのはなぜですか?

最後に、ワイルドカードを削除してテキストをすべて小文字に変更すると、textフィールドを検索しても問題なくそのレコードが検索されます。だから、問題がどんなものであっても、アスタリスクをワイルドカードとして使用することと関係があるようです。

答えて

0

すべてLowerCaseFilterFactoryフィルタの最初には、それはあなたがワイルドカードを使用している場合は、それがwordDelimiterFilter

によって分割され、小文字にすべての文字を変換しますWordDelimiterFilterFactoryフィルタ

<filter class="solr.LowerCaseFilterFactory"/> 

前に行くべき、正確な数学であるtext:((NOFX_SiteTest_4))を追加してください。

決勝

text:(NOFX_SiteTest_4*) OR text_exact:(NOFX_SiteTest_4*) OR text:(NOFX_SiteTest_4) 

何が起こっているかを確認するために分析Solrのツールを使用してください。

+0

Solr解析ツールは私にはあまり言いません。私はそれを読む方法について多くを学んだと思います。スキーマ内のフィルタを移動し、追加のテキスト:フィールドクエリを追加しましたが、何も変更されませんでした。小文字のクエリは依然としてドキュメントを生成しませんでした。 – Christoph

+0

あなたのプリントスクリーンを教えてください。 https://lucene.apache.org/solr/guide/6_6/analysis-screen.html – Oyeme

+0

私の元の質問:https://imgur.com/a/IPO7N。推奨クエリ:https://imgur.com/a/g2fx0それはまだ私にとってギリシャ語です。私は今分析ツールを読んでいます。 – Christoph

0

ワイルドカードを使用している場合、分析チェーンは通常通り実行されません。

唯一のフィルタinvoked are those that implement MultiTermAwareComponentです。そのため、分析ページでは何が起こっているのかを教えてくれません。

これは(など、それらを分割する)ワイルドカード検索をやっているとき、場合、インデックスパイプラインは、トークンを変更したことを意味照会するときに、その処理がは発生しません。それはおそらくあなたが好きなようにヒットを取得しないが、ワイルドカードを使用しないとうまくいく理由です。これは、WordDelimiterFilterがマルチテラバイトではないため、インデックスを作成するときに入力テキストが複数のトークンに分割され、クエリを実行しているときには発生しません。トークンは一致しないので(NOFX *が一致する可能性があると思いますが、それは両側に単一のトークンであるためです)、ヒットしません。

の場合には解析されたテキストのワイルドカードが必要ですが、NgramFilterを実行してそのフィルタを調整して各トークンに必要な結果を得る必要があります。しかし、チェーン内にNgramFilterをどこに追加するか(つまり、単語デリミタの前後など)に応じて、これは異なる動作をします。

関連する問題