2009-11-11 15 views
6

बस सोलर स्थापित किया गया, schema.xml संपादित किया गया, और अब मैं इसे अनुक्रमणित करने की कोशिश कर रहा हूं और कुछ परीक्षण डेटा के साथ इसे खोज रहा हूं।एसओएलआर कुछ क्षेत्रों पर खोज नहीं कर रहा है

एक्सएमएल फ़ाइल मैं Solr के लिए भेज रहा हूं में, मेरा क्षेत्रों में से एक इस तरह दिखेगा:

<field name="PageContent"><![CDATA[<p>some text in a paragrah tag</p>]]></field> 

वहाँ एचटीएमएल वहाँ है, तो मैं CDATA में लपेटा गया है।

मेरी Solr schema.xml में, उस क्षेत्र के लिए परिभाषा इस तरह दिखता है:

<field name="PageContent" type="text" indexed="true" stored="true"/> 

जब मैं पोस्टिंग उपकरण भाग गया, सब कुछ ठीक हो गया था, लेकिन जब मैं सामग्री के लिए खोज मैं जानता हूँ कि जो PageContent क्षेत्र के अंदर है , मुझे कोई परिणाम नहीं मिला।

हालांकि, जब मैं <defaultSearchField> नोड PageContent पर सेट करता हूं, तो यह काम करता है। लेकिन अगर मैं इसे किसी अन्य क्षेत्र में सेट करता हूं, तो यह PageContent में नहीं खोजता है।

क्या मैं कुछ गलत कर रहा हूं? मुद्दा क्या है?

मैं निम्न डेटा के साथ एक "डॉक" अपलोड कर दिया है:

<field name="PageID">928</field> 
<field name="PageName">some name</field> 
<field name="PageContent"><![CDATA[<p>html content</p>]]></field> 

मेरी स्कीमा में मैं जैसे क्षेत्रों में परिभाषित किया गया है:


त्रुटि पर स्पष्ट करने के लिए

<field name="PageID" type="integer" indexed="true" stored="true" required="true"/> 
<field name="PageName" type="text" indexed="true" stored="true"/> 
<field name="PageContent" type="text" indexed="true" stored="true"/> 

और:

<uniqueKey>PageID</uniqueKey> 
<defaultSearchField>PageName</defaultSearchField> 

अब, जब मैं सोलर व्यवस्थापक टूल का उपयोग करता हूं और "some name" खोजता हूं तो मुझे परिणाम मिलता है। लेकिन, अगर मैं "html content", "html", "content" या "928" खोजते हैं, मैं कोई परिणाम नहीं

क्यों मिलता?

उत्तर

7

आपने बताया कि आपका डिफ़ॉल्ट खोज फ़ील्ड पेजनाम पर सेट है, मैं "सामग्री" को कुछ भी वापस करने की खोज की अपेक्षा नहीं करता।

शायद आप उस क्षेत्र में डेटा खोजने के लिए खोज बॉक्स में "पेज सामग्री: सामग्री" डालना चाहते थे। यदि आप कई फ़ील्ड के खिलाफ खोजना चाहते हैं तो आप इसे http://wiki.apache.org/solr/DisMaxRequestHandler से देखना चाहेंगे। सोलर एडमिन कंसोल सभी डिसमैक्स खोज विकल्पों के साथ खेलने के लिए एक उपकरण का शानदार नहीं है, आप इसके लिए यूआरएल में हेरफेर करना चाहते हैं।

भले ही, मैं पिछले पोस्टर से सहमत हूं, यदि आपका विश्लेषण सेटअप HTML से निपटने के लिए ठीक से सेटअप नहीं है, तो आपको अप्रत्याशित खोज परिणामों के सभी प्रकार मिलेंगे। एचटीएमएल आउट और इंडेक्स टेक्स्ट को केवल स्ट्रिप करें।

यदि आप अपने मानक क्वेरी हैंडलर को अपने सभी क्षेत्रों के विरुद्ध खोजना चाहते हैं तो आप इसे अपने solrconfig.xml में बदल सकते हैं (मैं हमेशा "मानक" को संशोधित करने के बजाय एक दूसरा क्वेरी हैंडलर जोड़ता हूं। क्यूएफ फ़ील्ड फ़ील्ड की सूची है के खिलाफ खोज करना चाहते हैं। यह एक अंतरिक्ष अलग सूची है।

<requestHandler name="standard" class="solr.DisMaxRequestHandler"> 

    <lst name="defaults"> 
      <str name="echoParams">all</str> 
      <str name="hl">true</str> 

      <str name="fl">*</str> 
      <str name="qf">PageName PageContent</str> 
    </lst> 

</requestHandler> 
+0

शांत, धन्यवाद ट्रे। सीधे सीधे बात करते हैं। मैं थोड़ा उलझन में हूँ। इसलिए, अगर मैं सिर्फ एक खोज क्वेरी भेजता हूं, यानी "solr /? Q = hi मैं सामग्री नोड में रहता हूं" एसओएलआर केवल एक ही क्षेत्र के खिलाफ लुकअप करेगा? जब मैं उदाहरण वेनिला एसओएलआर सेटअप चलाता हूं तो मुझे लगता है कि एक ही साधारण क्वेरी सभी क्षेत्रों की खोज करती है? क्या मै गलत हु? – andy

+1

क्योंकि टिप्पणियों में कोई वाक्यविन्यास हाइलाइटिंग नहीं है, इसलिए मैंने सुझाव के साथ ऊपर स्पष्ट किया है। – Trey

+0

+1 मीठा, धन्यवाद दोस्त, मैं इसे आज़माउंगा और आपको वापस ले जाऊंगा – andy

1

आप यह सुनिश्चित कर रहे हैं कि आपके डेटा को खोजने का प्रयास करने से पहले किया गया है, है ना?

इसके अलावा, यदि आप कच्चे HTML को स्टोर करना चाहते हैं तो वास्तव में HTML को वास्तव में हटाने के लिए सबसे अच्छा है। आप की तरह आपके आवेदन या Solr के solr.HTMLStripWhitespaceTokenizerFactory का प्रयोग करने में कर सकते हैं,:

<tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 

जो तुम "पाठ" के लिए अपने fieldtype परिभाषा घोषणा करते हैं। तुम्हें पता है, शायद text_html की तरह कुछ सिर्फ अपने एचटीएमएल के लिए एक नए क्षेत्र प्रकार बनाने के लिए चाहते हो सकता है और आप ऐसा की तरह उपयोग कर सकते हैं:

<fieldtype name="text_html" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer type="index"> 
      <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
      <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
     <analyzer type="query"> 
      <tokenizer class="solr.HTMLStripWhitespaceTokenizerFactory"/> 
      <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/> 
      <filter class="solr.StopFilterFactory" ignoreCase="true"/> 
      <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.EnglishPorterFilterFactory" protected="protwords.txt"/> 
      <filter class="solr.RemoveDuplicatesTokenFilterFactory"/> 
     </analyzer> 
    </fieldtype> 

मैं द्वारा यकीन है कि तुम क्या मतलब है नहीं कर रहा हूँ:

However, when I set the node to PageContent, it works. But if I set it to any other field, it doesn't search in PageContent.

कर सकते हैं आप कृपया विस्तृत करें?

+0

कूल कोडी, उपरोक्त कोड वास्तव में उपयोगी है, मैं निश्चित रूप से HTML को बाहर कर दूंगा। पेजकंटेंट समस्या के लिए, मैंने ऊपर अपना प्रश्न अपडेट कर लिया है। बहुत बहुत धन्यवाद। – andy

1

fl क्वेरी द्वारा रिटर्न फ़ील्ड की सूची है .. qf सूची आप का उल्लेख करना चाहता था है और यह वाइल्ड कार्ड का समर्थन नहीं करता ..

उन सभी को सूचीबद्ध किए बिना सभी फ़ील्ड को खोजने का एकमात्र तरीका एक प्रतिलिपि है जो सभी v को पकड़ता है अल्यूज़ (केवल अनुक्रमित नहीं किया गया है), फिर इसके खिलाफ खोज करके सभी क्षेत्रों के खिलाफ खोज कर रहे हैं

0

मेरी schema.xml में मेरे पास निम्न जैसे कुछ हैं जो पाठ फ़ील्ड में _t के साथ समाप्त होने वाले प्रत्येक फ़ील्ड के मान की प्रतिलिपि बनाते हैं।

<defaultSearchField>text</defaultSearchField> 
<copyField source="*_t" dest="text" maxChars="3000"/> 
0

पैरामीटर flनहीं के खिलाफ क्वेरी करने के लिए फ़ील्ड को निर्दिष्ट करता है, लेकिन खेतों जवाब में वापस जाने के लिए।

तुम बस schema.xml को जोड़ सकते हैं:

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

<defaultSearchField>fieldContainingEverything</defaultSearchField> 

<copyField source="*" dest="fieldContainingEverything" maxChars="3000"/> 

अब जब अनुक्रमण, हर क्षेत्र fieldContainingEverything को कॉपी किया है। यहां समस्या यह है कि यदि आप उस जानकारी के साथ और मूल्यांकन करना चाहते हैं तो आप उस क्षेत्र का ट्रैक खो सकते हैं, जिससे सामग्री आ रही है। अगर किसी के बारे में कोई विचार था तो मुझे खुशी होगी।

में थोड़ा और अधिक विवरण के साथ परिदृश्य का वर्णन करने के लिए:: मैं सूचकांक के क्षेत्रों का एक बहुत के साथ एक MySQL डेटाबेस तालिका है, और सिर्फ हर क्षेत्र को आयात करके ऐसा


मैं कुछ हद तक एक कार्यात्मक समाधान नहीं मिला हर क्षेत्र को निर्दिष्ट किए बिना (SELECT * FROM ...)। मैं तालिका के हर क्षेत्र के खिलाफ इंडेक्स से पूछताछ करना चाहता हूं और जानना चाहता हूं कि कौन सा क्षेत्र क्वेरी से मेल खाता है। बॉक्स के बाहर यह संभव नहीं है क्योंकि हाइलाइटर आपको बताता है कि क्वेरी से मेल खाने वाला फ़ील्ड fieldContainingEverything है। का उपयोग करके क्वेरी हैंडलर मैंने पाया कि भले ही इसे हर क्षेत्र में खोजना कहा जाता है, मुझे लगता है कि यह उन क्षेत्रों के माध्यम से खोजने के लिए प्रतीत नहीं होता है जो qf पैरामीटर में निर्दिष्ट नहीं हैं। विचार अब जोड़कर प्रत्येक फ़ील्ड को जोड़ना है:

<dynamicField name="*" type="string" indexed="true" stored="true"/> 

आपके schema.xml पर। अब, जब आप hl.true&hl.fl=* के साथ सोलर से पूछते हैं, तो आप अपनी पैरामीटर सूची में qf=fieldContainingEverything^1 जोड़ते हैं। सोलर अब प्रत्येक अनुक्रमित क्षेत्र के माध्यम से खोज करता है, लेकिन क्वेरी टर्म युक्त प्रत्येक फ़ील्ड को भी हाइलाइट करता है।इस विधियों का नकारात्मक हिस्सा स्पष्ट रूप से बढ़ी हुई इंडेक्स आकार है जो मुझे लगता है कि ज्यादातर मामलों में प्रासंगिक नहीं होना चाहिए।

संबंधित मुद्दे