2017-05-12 1 views
0

이것은 매우 간단한 질문처럼 보입니다. 그러나 저는 오랫동안 Google을 수색했으며 어떤 답변도 찾지 못했습니다.solr sql select * 문을 어떻게 수행합니까?

특히 Solr 6.5.0을 사용하여 매우 간단한 select * sql 쿼리를 실행하는 문제가 있습니다.

  • Q : 내가 달성하기 위해 노력하고 무엇입니까?
    • A : 나는에 실행하고 어떤 문제 : 사용 SOLR의 SQL 무제한 select 문은 "property_1"== 100
  • Q가 내 컬렉션의 모든 레코드를 선택?

    • A : 쿼리를 수행 할 때 내가 말하는 오류가 발생 "때 java.io.IOException :. 점수는 무제한 쿼리에 대한 유효한 필드 아니다"
  • Q : 내가 자동으로 내 SQL 쿼리를 득점에서 SOLR 방지하려면 어떻게 (내가 점수에 대한 상관 없어) 그래서 나는 무제한 SQL 쿼리를 수행하고 다시 내가 원하는 문서의 모든 필드를 얻을 수 있습니다 ?

    • 대답 : ????

내가 SOLR 자동으로 결과에 점수 필드를 포함하고 점수 필드가 무제한 SQL 쿼리에 사용할 수 없으므로 실패 내 컬렉션에있는 모든 문서에 대한 SOLR의 SQL 쿼리를 수행. 것은 내 컬렉션에 "점수"필드가 없기 때문에 점수를 매길 결과를 묻지 않았습니다. 인터넷 검색에서 기본적으로 solr에서 스코어 필드를 얻는 것처럼 보일 수 있지만 내 읽기 (내가하지 않은)에서 요청한 경우에만 읽어야한다고 제안합니다.

저는 Solr admin UI를 사용하여 SQL 쿼리를 수행하고 있습니다. 다음은 정확한 오류 메시지가 내가 얻을 수있다 :

stmt=select * from TestIndex where property_1 = '100'" 

{ 
    "result-set":{ 
    "docs":[{ 
     "EXCEPTION":"Failed to execute sqlQuery 'select * from TestIndex 
where property_1 = '100'' against JDBC connection 'jdbc:calcitesolr:'.\nError 
while executing SQL \"select * from TestIndex where property_1 = '100'\": 
java.io.IOException: score is not a valid field for unlimited queries.", 
     "EOF":true, 
     "RESPONSE_TIME":172}]}} 

을 지금 여기에 대신 위의 쿼리를 사용 제외하고는 동일한 쿼리가, 나는 "FieldA을 선택"을 포함하는 모든 레코드를 얻을 수와 부분 "*를 선택"교체 "FieldA". 이 쿼리는 문제는 내가 위의 쿼리 나에게 쓸모 있도록 모든 필드 그냥 FieldA을하지 반환 할 것입니다 무제한 SQL을 선택 작품

stmt=select FieldA from TestIndex where property_1 = '100'" 

    { 
    "result-set":{ 
    "docs":[{ 
     "FieldA":["AAAA"]} 
     ,{ 
     "FieldA":["AAAA"]} 
     ,{ 
     "FieldA":["AAAA"]} 
     ,{ 
     "EOF":true, 
     "RESPONSE_TIME":247}]}} 

을 증명하는 다음과 같은 결과를 생성합니다. 또한 이것은 단지 POC입니다. 실제 상황에서 SQL 문에있는 모든 필드를 지정하는 것은 비현실적입니다. *가 작동하기를 기대합니다. Solr이 무제한 결과에서 점수를 자동으로 제공하려고 시도하지 않는 것 같습니다. 따라서 다음 SQL 쿼리를 실행하는 것은 실제 시나리오에서는 현실적이지 않습니다.

stmt=select FieldA, FieldB, FieldC, FieldD from TestIndex where property_1 = 
'100' 

매우 간단하게 만들기 위해 테스트 컬렉션에는 문서가 6 개 있습니다. 다음은 모든 문서입니다.나는이 결과를 얻기 위해 non sql solr/select 핸들러를 사용했다. (어느 BTW에서 solr/select * : *와 같은 결과를 내기 위해 solr sql select *를 수행 할 수있을 것으로 기대한다) :

{ 
    "responseHeader":{ 
    "zkConnected":true, 
    "status":0, 
    "QTime":0, 
    "params":{ 
     "q":"*:*", 
     "indent":"on", 
     "wt":"json", 
     "_":"1494587051946"}}, 
    "response":{"numFound":6,"start":0,"docs":[ 
    { 
     "FieldA":["AAAA"], 
     "FieldB":["BBBB"], 
     "FieldC":["CCCC"], 
     "FieldD":["DDDD"], 
     "dateTimestamp":1494591988400, 
     "property_1":100, 
     "_version_":1567193288840052736}, 
     { 
      "FieldA":["AAAA"], 
      "FieldB":["BBBB"], 
      "FieldC":["CCCC"], 
      "FieldD":["DDDD"], 
      "dateTimestamp":1494591988403, 
      "property_1":100, 
      "_version_":1567193289014116352}, 
     { 
      "FieldA":["AAAA"], 
      "FieldB":["BBBB"], 
      "FieldC":["CCCC"], 
      "FieldD":["DDDD"], 
      "dateTimestamp":1494591988404, 
      "property_1":100, 
      "_version_":1567193289034039296}, 
     { 
      "FieldA":["AAAA"], 
      "FieldB":["BBBB"], 
      "FieldC":["CCCC"], 
      "FieldD":["DDDD"], 
      "dateTimestamp":1494591995474, 
      "property_1":200, 
      "_version_":1567193296256630784}, 
     { 
      "FieldA":["AAAA"], 
      "FieldB":["BBBB"], 
      "FieldC":["CCCC"], 
      "FieldD":["DDDD"], 
      "dateTimestamp":1494591995475, 
      "property_1":200, 
      "_version_":1567193296265019392}, 
     { 
      "FieldA":["AAAA"], 
      "FieldB":["BBBB"], 
      "FieldC":["CCCC"], 
      "FieldD":["DDDD"], 
      "dateTimestamp":1494591995476, 
      "property_1":200, 
      "_version_":1567193296267116544}] 
}} 

긴 게시물을 위해 죄송합니다. 나는 모든 세부 사항을 주려고 노력했다.

아이디어가 있으십니까? (순간에 실험적인 기능이다)

답변

0

According to the docs for ParallelSQL :

모든 필드를 표시하는 * 구문이 제한 또는 무제한 쿼리 중 하나에서 지원되지 않습니다.

.. 이것은 계산되는 점수와 관련이없는 것으로 보이지만 * 발급하는 것은 불가능합니다.

내 생각에은 JDBC 드라이버/SQL 구현이 데이터를 반환하기 전에 각 열의 이름을 알아야한다는 것과 모든 필드를 요청할 때 1m 등급의 문서에 새 필드 이름이 나타날 수 있다는 것입니다 그래서 SQL 인터페이스는 결과 셋을 두 번 반복 할 것입니다. 한 번은 모든 필드 이름을 얻고 한 번은 문서를 가져옵니다.하지만 DB를 잠그지 않으면 두 번째 요청까지 문서가 변경 될 수 있습니다. t performant), 또는 그것을 읽는 동안 메모리에있는 모든 것을 캐시합니다. 큰 데이터 셋에는 작동하지 않습니다.

+0

참조한 페이지를 읽었지만 이전 정보라고 가정했습니다. 버전 6.4로 쿼리를 시도 할 때 우리 오른쪽 요청이 실패했기 때문입니다. 6.5에서는 요청이 제외되었으며 스코어 필드가 아닌 경우 다시 스트리밍 된 것처럼 보였습니다. 응답 주셔서 감사합니다. – Don