2014-11-05 3 views
0

Я пытаюсь индексировать вложенную структуру, как показано ниже, и с трудом индексируя как с SOlrJ, так и с DIH. Я боролся с этим некоторое время и был бы очень признателен за помощь в этом.Solr BlockJoin Индексирование для Solr 4.10.1

Как исправить это с помощью SolrJ или DIH. Благодаря

Что я хочу, чтобы мои данные, чтобы посмотреть, как мой индекс:

"DOCS": [

{ 
    "name": "MR INCREDIBLE ", 
    "id": 101, 
    "job": "super hero", 
    "_version_": "1483934897344086016" 
    "children": [ 
      { 
       "c_name":"Violet" 
       "c_age":10 
       "c_gender":"female" 
      }, 
      { 
       "c_name":"Dash" 
       "c_age":8 
       "c_gender":"male" 
      } 
    ] 
} 

]

Мой schema.xml

<schema name="datasearch" version="1.5"> 
<uniqueKey>id</uniqueKey> 
<fields> 
    <field name="_version_" type="long" indexed="true" stored="true" /> 
    <field name="_root_" type="string" indexed="true" stored="false"/> 

    <field name="id" type="string" indexed="true" stored="true" /> 
    <field name="name" type="text" indexed="true" stored="true" /> 
    <field name="job" type="string" indexed="true" stored="true"/> 

    <!-- I want to add children here --> 
    <!-- <field name="children" indexed="true" stored="true"/> --> 
    <field name="c_name" type="string" indexed="true" stored="true"/> 
    <field name="c_age" type="int" indexed="true" stored="true"/> 
    <field name="c_sex" type="string" indexed="true" stored="true"/> 
</fields> 

<types> 
    <fieldType name="string" class="solr.TrieLongField" /> 
    <fieldType name="int" class="solr.TrieIntField" /> 
    <fieldType name="date" class="solr.TrieDateField" omitNorms="true" /> 
    <fieldType name="long" class="solr.StrField" sortMissingLast="true"/> 
    <fieldType name="text" class="solr.TextField" positionIncrementGap="100"> 
     <analyzer> 
      <tokenizer class="solr.StandardTokenizerFactory"/> 
      <filter class="solr.LowerCaseFilterFactory"/> 
      <filter class="solr.PorterStemFilterFactory"/> 
     </analyzer> 
    </fieldType> 
</types> 

<defaultSearchField>name</defaultSearchField> 

</schema> 

SolrJ Покушение

val serverUrl = current.configuration.getString("solr.server.url").get 
val solr = new HttpSolrServer(serverUrl) 

def testAddChildDoc={ 
val doc = { 
    new SolrInputDocument(){ 
    addField("id", "101") 
    addField("name", "Mr Incredible") 
    } 
} 
val c1 = new SolrInputDocument(){ 
    addField("c_name", "violet") 
    addField("c_age", 10) 
} 
val c2 = new SolrInputDocument(){ 
    addField("c_name", "dash") 
    addField("c_age", 8) 
} 

doc.addChildDocument(c1) 
doc.addChildDocument(c2) 

solr.deleteByQuery("*:*") 
solr.add(doc) 
solr.commit(true, true) 
} 

Response

=>ERROR org.apache.solr.core.SolrCore – org.apache.solr.common.SolrException: [doc=null] missing required field: id 
[RemoteSolrException: [doc=null] missing required field: id] 

Так я пойти дальше и добавить идентификатор к childDocs делая выше

...  
val c1 = new SolrInputDocument(){ 
    addField("id", "101") 
    addField("c_name", "violet") 
    addField("c_age", 10) 
} 
val c2 = new SolrInputDocument(){ 
    addField("id", "101") 
    addField("c_name", "dash") 
    addField("c_age", 8) 
} 
..... 

Затем повторите Get-все запросы, теперь я получаю результаты ниже

SolrJ Попытка 2 плюс получить все-запрос

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 0, 
    "params": { 
     "indent": "true", 
     "q": "*:*", 
     "_": "1415194092582", 
     "wt": "json" 
    } 
    }, 
    "response": { 
    "numFound": 3, 
    "start": 0, 
    "docs": [ 
     { 
     "id": 101, 
     "c_name": violet, 
     "c_age": "10", 
     }, 
     { 
     "id": 101, 
     "c_name": dash, 
     "c_age": "8" 
     }, 
     { 
     "id": 101, 
     "name": "Mr Incredible", 
     "_version_": "1483938552238571520" 
     } 
    ] 
    } 
} 

Так я даю здесь и попробовать DIH, как показано ниже

дб-dataconfig.xml

<dataConfig> 
    <dataSource type="JdbcDataSource" 
       driver="org.postgresql.Driver" 
       url="jdbc:postgresql://xxx:5432/xxxx" 
       user="xx" password="xx" 
       readOnly="true" autoCommit="false" transactionIsolation="TRANSACTION_READ_COMMITTED" holdability="CLOSE_CURSORS_AT_COMMIT" /> 
    <document> 
     <entity name="parent" query="select id,name, job from PARENTS LIMIT 1" > 
      <field column="name"/> 
      <field column="id"/> 
      <field column="job"/> 

       <entity child="true" name="children" query="select c_name, c_gender, c_age from CHILDREN" where="pid = ${parent.id}" processor="CachedSqlEntityProcessor"> 
        <field column="c_age" /> 
        <field column="c_gender" /> 
        <field column="c_name"/> 
       </entity> 
     </entity> 
    </document> 
</dataConfig> 

запроса получить все-после полной импорт с DIH, как указано выше, и детей с индексом

{ 
    "responseHeader": { 
    "status": 0, 
    "QTime": 0, 
    "params": { 
     "indent": "true", 
     "q": "*:*", 
     "_": "1415195060664", 
     "wt": "json" 
    } 
    }, 
    "response": { 
    "numFound": 1, 
    "start": 0, 
    "docs": [ 
     { 
     "name": "Mr Incredible", 
     "id": 101, 
     "_version_": "1483939357483073536" 
     } 
    ] 
    } 
} 
+0

Я должен отметить, что выше является упрощенной версией моего схема и денормализация не являются опцией. Кроме того, я должен иметь возможность делать такие запросы, как «найти родителей, у которых есть дочь 10 лет», которые я не могу делать AFAIK с многозначными полями – deVIAntCoDE

ответ

0

Для использования child="true" в DIH примените патч от https://issues.apache.org/jira/browse/SOLR-5147 (я думаю, что это тот же патч DIH на solr-3076).

Патч сам по себе несовместим с пренебрежимыми деталями с текущей стволом.

+0

Пожалуйста, не предоставляйте ссылки только на ответы. – cheffe

+0

, чтобы иметь возможность использовать child = "true" в DIH, применить патч от https://issues.apache.org/jira/browse/SOLR-5147 (я думаю, что это тот же патч dih на solr-3076) – mkhludnev

+0

@cheffe SO не моя основная платформа, но ваш «-1» кажется удручающим. Я исправил его, как вы посоветовали, не могли бы вы перевернуть его обратно? – mkhludnev

0

Для того, чтобы получить следующий ответ от Solr 4.10.1

{ 
    "name": "MR INCREDIBLE ", 
    "id": 101, 
    "job": "super hero", 
    "type": "parent", 
    "_root_":"101" 
    "_version_": "1483934897344086016" 
    "childDocuments": [ 
     { 
      "c_name":"Violet", 
      "c_age":10, 
      "c_gender":"female", 
      "id":"101_Violet", 
      "_root_":"101" 
     }, 
     { 
      "c_name":"Dash", 
      "c_age":8, 
      "c_gender":"male", 
      "id":"101Dash", 
      "_root_":"101" 
     } 
    ] 
} 

поле «тип» должен быть определен в схеме, чтобы различать между родительскими и дочерними документами:

<fields> 
    <field name="_version_" type="long" indexed="true" stored="true" /> 
    <field name="_root_" type="string" indexed="true" stored="false"/> 

    <field name="id" type="string" indexed="true" stored="true" /> 
    <field name="name" type="text" indexed="true" stored="true" /> 
    <field name="job" type="string" indexed="true" stored="true"/> 

    <field name="c_name" type="string" indexed="true" stored="true"/> 
    <field name="c_age" type="int" indexed="true" stored="true"/> 
    <field name="c_gender" type="string" indexed="true" stored="true"/> 

    <field name="type" type="string" indexed="true" stored="true" /> 
</fields> 

ребенка документы также должны иметь уникальный «идентификатор», как и любой другой документ. Все документы в индексе должны быть связаны с родительским/дочерним отношением, иначе запросы могут возвращать неожиданные результаты. Если вам нужны документы, которые не являются ни родителями, ни детьми, назначьте их поддельным родителем.

SolrJ

Для работы с ребенком/родителем документы, solrj.jar версии 4.5 или выше требуется.

SolrServer solr = new HttpSolrServer(serverUrl); 

SolrInputDocument doc = new SolrInputDocument(); 
String id = "101"; 
doc.addField("id", id); 
doc.addField("name", "Mr Incredible"); 
doc.addField("job", "super hero"); 
doc.addField("type", "parent"); 

SolrInputDocument childDoc1 = new SolrInputDocument(); 
String name1 = "Violet"; 
childDoc1.addField("id", id + "_" + name1); 
childDoc1.addField("c_name", name1); 
childDoc1.addField("c_age", 10); 
childDoc1.addField("c_gender", "female"); 
doc.addChildDocument(childDoc1); 

SolrInputDocument childDoc2 = new SolrInputDocument(); 
String name2 = "Dash"; 
childDoc2.addField("id", id + "_" + name2); 
childDoc2.addField("c_name", name2); 
childDoc2.addField("c_age", 8); 
childDoc2.addField("c_gender", "male"); 
doc.addChildDocument(childDoc2); 

solr.add(doc); 
solr.commit(); 

Наконец, запрос выглядит следующим образом:

http://localhost/solr/core/select?q={!parent which='type:parent'}&fl=*,[child parentFilter=type:parent]&wt=json&indent=true 

Чтобы получить результаты только женского пола:

http://localhost/solr/core/select?q={!parent which='type:parent'}c_gender:female&fl=*,[child parentFilter=type:parent childFilter=c_gender:female]&wt=json&indent=true 
Смежные вопросы