2017-06-18 168 views
0

我想讓我的DSE搜索查詢工作(使用Solr)。但是,在使用用戶定義類型(UDT)構建查詢時,我遇到了空白字符的問題。 例如:我有一個Student表和Name類型,其中Student表有一個list<frozen<Name> namesName類型有說,firstnamelastname。如果我做下面的查詢時,它拋出一個錯誤:DSE搜索和Solr - UDT搜索查詢中的空白問題

Unable to execute CQL Script : no field name specified in query and no default specified via ‘df’ param. 

SELECT * from Student where solr_query= '{!tuple}names.firstname:John Smith';

所以,我想逃避空白如下,它工作得很好。

SELECT * from Student where solr_query= '{!tuple}names.firstname:John\ Smith';

但是,當我用AND運算符使用上面的UDT字段時,它又失敗了。

SELECT * from Student where solr_query= 'student_id:123456 AND {!tuple}names.firstname:John\ Smith';

無法執行CQL腳本:org.apache.solr.search.SyntaxError:後:第1行,列...遇到無法解析names.firstname ...詞法錯誤「」

這是名字的字段類型:

<fieldType class="org.apache.solr.schema.TextField" name="DelimitedTextField"> 
     <analyzer> 
     <tokenizer class="solr.PatternTokenizerFactory" pattern="[,\s]"/> 
     <filter class="solr.LowerCaseFilterFactory"/> 
     </analyzer> 
    </fieldType> 

作爲Solr的初學者,我一直在試圖讓這些查詢工作。任何幫助將深表感謝。謝謝!

回答

0

我並不是所有您似乎正在使用的DSE系統的專家,但看看這個資源[1],似乎您可能會以錯誤的方式構建布爾查詢。 這似乎是一個正確的做法:

+ {元組V =! 'father.name.firstname:薩姆'} + {元組V =! 'mother.name.firstname:安妮'}

希望它可以幫助

[1] http://docs.datastax.com/en/datastax_enterprise/4.8/datastax_enterprise/srch/srchTupleUDTqueries.html

+0

謝謝亞歷山德羅,我想我遇到的問題可能是因爲我使用PatternTokenizer的方式。無論如何,我能解決它,我已經回答了這個問題。 – Amith

0

我能夠做一些事情來得到這個工作。

  1. 我創建了一個新的和org.apache.solr.schema.TextField加入
    PatternTokenizerFactory標記生成器,用逗號(,)作爲圖案。

  2. 在開始處和結尾處修整了白色空格,並且 用'?'替換了文本中的空格。它匹配任何 單個字符。這對我來說可以。我不得不在整個查詢中添加大括號()。

因此,用更新的Schema.xml文件和上面提到的其他變化,我有以下查詢現在的工作:

SELECT * from Student where solr_query= '(student_id:123456 AND {!tuple}names.firstname:John?Smith)';

Eventhough這將匹配約翰·史密斯,約翰·史密斯,或即使是約翰史密斯,我的情況也沒有問題,因爲無論如何我們都應該回饋這些結果。

+0

爲什麼不使用標準或經典的分詞器+(單詞分隔符標記過濾器)並只執行經典的多項詞查詢? 運行正則表達式查詢並不理想。 我不明白爲什麼你會需要一個,當你似乎只是在這兩個詞感興趣。 –