2015-10-08 6 views
6

सॉर्ट करने में दिनांक फ़ील्ड गठबंधन करें हमारे पास कुछ दस्तावेज हैं जो d1 के साथ कुछ दस्तावेजों और d2 पर किसी अन्य दस्तावेज पर अनुक्रमित हैं, और हम उन दोनों को क्रमबद्ध करना चाहते हैं जो एक उपलब्ध हैं।सोलर

sort=d1 desc, d2 desc 

इस तरह seperatly d2 साथ दस्तावेज़ के लिए d1 साथ दस्तावेज़ को सॉर्ट होगा,:

d1: 2014-03-12 
d2: 2013-03-12 
d2: 2011-03-12 
d1: 2010-03-12 

साथ सभी दस्तावेजों reindexing:

d1: 2014-03-12 
d1: 2010-03-12 
d2: 2013-03-12 
d2: 2011-03-12 

क्या हम चाहते हैं सब कुछ इस तरह हल कर है एक नया आम क्षेत्र दुर्भाग्य से एक विकल्प नहीं है।

उत्तर

1

जितना मुझे पता है, आप सोलर की फ़ंक्शन क्वेरीज़ का उपयोग कर सकते हैं। इस तरह के लिए, यह है कि

प्रकार की तरह कुछ है = अगर ((पेट (एमएस (D1, D2))> 0), D1, D2) की वर्णन

मैं अभी तक यह परीक्षण नहीं किया है, लेकिन यहाँ है उपयोगी लिंक जो आपकी समस्या का समाधान करेगा।

https://wiki.apache.org/solr/FunctionQuery
Sort result by date difference

0

के रूप में यह this discussion में invoqued था, तो आप ConcatFieldUpdateProcessorFactory साथ अपने डेटा को अपडेट कर सकते हैं::

आप copyField जानकारियां जाँच कर सकते हैं यहाँ

<processor class="com.test.solr.update.CustomConcatFieldUpdateprocessorFactory"> 
    <str name="field">d1</str> 
    <str name="field">d2</str> 
    <str name="dest">date</str> 
    <str name="delimiter"></str> 
</processor> 

उसके बाद, आप सॉर्ट करने के लिए कोशिश कर सकते हैं आपके क्षेत्र की तारीख से।

1

function का उपयोग करने के लिए अब्दुल का दृष्टिकोण सही दृष्टिकोण है। लेकिन अब्दुल का समाधान मेरे लिए काम नहीं करता है।

मैंने सफलतापूर्वक इसका परीक्षण किया है।

बस आपकी क्वेरी के लिए इस पैरामीटर जोड़ें:

sort=max(d1,d2) desc 
0

दो सुझाव, जिनमें से एक पहले से ही प्रस्तावित किया गया है:

(1) का प्रयोग करें copyField

<field name="d" type="date" indexed="true" stored="true" multiValued="false"/>  
<copyField source="d1" dest="d" /> 
<copyField source="d2" dest="d" /> 

यहां तक ​​कि अगर d1 और d2 क्षेत्रों महत्वपूर्ण हैं, आप अभी भी अपने प्रश्न में उन्हें शामिल कर सकते हैं, लेकिन सिर्फ तरह मर्ज किए गए d मैदान पर।

(2) अपने डेटा स्रोत के प्रकार के आधार पर, आप इन दोनों फ़ील्ड को एक में विलय करने के लिए अपनी data-config.xml फ़ाइल में क्वेरी को संभावित रूप से संशोधित कर सकते हैं। हमारे पर्यावरण में, हम एक MySQL उदाहरण से सूचकांक डेटा के लिए सोलर का उपयोग कर रहे हैं। ऐसे कई बार होते हैं जहां विभिन्न डेटाबेस से डेटा को सौर में समेकित किया जा रहा है। यह एक समान समस्या पेश करता है जहां हमें विभिन्न डेटाबेस से आने वाले डेटा को सामान्य करने की आवश्यकता होती है।इन परिस्थितियों में, हम अक्सर हमारे प्रश्नों में CASE या IFNULL जैसी संरचनाओं का उपयोग करते हैं। यदि यह आपकी स्थिति पर लागू होता है तो मैं अधिक विशिष्टताओं में शामिल हो सकता हूं।

0

मुझे आपकी समस्या बहुत ही समान थी। मेरे मामले में सभी दस्तावेजों में "डी 1" और "डी 2" फ़ील्ड थे, और उनमें से सभी के पास "डी 1" मान था। "डी 2" मान का उपयोग "डी 1" मान को ओवरराइट करने के लिए किया जाता है।

इस के लिए मेरे समाधान है:

sort=map(ms(d2),0,0,ms(d1)) desc 

map(ms(d2),0,0,ms(d1)) "d2" टाइमस्टैम्प वापस आ जाएगी अगर यह खाली नहीं है; यदि ऐसा है, तो "d1" टाइमस्टैम्प का उपयोग

उम्मीद है कि यह किसी की सहायता करता है।