Как использовать `PreAnalyzedField` в SOLR для хранения аннотаций? - PullRequest
0 голосов
/ 10 ноября 2019

Использование Solr 8.1.1 (работает в облачном режиме).

Я не могу заставить PreAnalyzedField, в частности, тот, у которого JsonPreAnalyzedParser, работать полностью.

После: https://lucene.apache.org/solr/guide/8_2/working-with-external-files-and-processes.html#the-preanalyzedfield-type

Определение моего поля и типа:

  <fieldType name="preanalyzed" class="solr.PreAnalyzedField" parserImpl="org.apache.solr.schema.JsonPreAnalyzedParser">
    <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>


  <field name="pre" type="preanalyzed" indexed="true" termOffsets="true"
         stored="true" termPositions="true" termVectors="true" multiValued="false"/>

Я добавляю тестовый документ, подобный следующему:

<doc>
    <field name="document_id">json_doc</field>
    <field name="author">XML AUTHOR</field>
    <field name="pre">{
                            "v": "1",
                            str: "This is two sentences"
                            "tokens": [
    {"t": "This", "s": 0, "e": 4, "y": "word"},
    {"t": "two", "s": 8, "e": 11, "y": "word"}]
                         }</field>
  </doc>

Я хотел бы получить pre.tokens массив в ответе на запрос.

Когда я запрашиваю "все"

/select?q=*:*

{"numFound":1,"start":0,"docs":[
      {
        "document_id":"json_doc",
        "author":["XML AUTHOR"],
        "pre":"This is two sentences",
        "_version_":1649822942659346432}]
}

Массив tokens отсутствует в pre.

Я знаю, что эти токены каким-то образом сохраняются (поэтому индексация документов работает) - потому что, когда я запрашиваю с выделением на pre:

{
    "params":{
      "q":"pre:two",
      "hl":"on",
      "hl.fl":"pre"
    },
  "response":{"numFound":1,"start":0,"docs":[
      {
        "document_id":"json_doc",
        "author":["XML AUTHOR"],
        "pre":"This is two sentences",
        "_version_":1649822942659346432}]
  },
  "highlighting":{
    "json_doc":{
      "pre":["This is <em>two</em> sentences"]
    }
  }
}
  1. Как получитьмассив токенов, возвращенный в запросе?

  2. Моей конечной целью является создание NER на поле с использованием spacy и сохранение аннотаций в SOLR, чтобы я мог запросить что-то вроде q=document_content:(Person:Paris Hilton)который будет возвращать документы, содержащие сущности типа: Person (поле y в токенах) и имя "Paris Hilton".

RealЯ хотел бы сделать что-то вроде того, что, как мне кажется, происходит здесь, в этом плагине "mapper annotated text" в Elastic Search: https://www.elastic.co/blog/search-for-things-not-strings-with-the-annotated-text-plugin

Я прочитал все заявки в SOLR и некоторые Java, относящиеся к PreAnalyzedFields:Это было особенно интересно: https://issues.apache.org/jira/browse/SOLR-11764

Может быть, я должен использовать это? https://lucene.apache.org/solr/8_2_0//solr-core/org/apache/solr/update/processor/PreAnalyzedUpdateProcessorFactory.html

...