Solr - 将标记化的多值字段复制到字符串

时间:2015-12-07 01:06:44

标签: solr lucene

我有一个字段,它被标记化并具有多个值的多值。我想将这些术语用作方面。当我尝试按照术语搜索时,我会收到一个问题,即搜索术语"不一定" (我们看到有一个空间),我得到的结果是"不是"。这让我相信我不能使用标记化字段作为构面字段。我尝试使用keywordtokenizer将字段的值复制到文本字段。在检查架构浏览器时我被告知:"抱歉,没有可用的术语信息:("这是在我删除旧索引并再次上传文档之后。我在这里做错了什么?

<copyField source="ColonCancerField" dest="cytokineField"/>

<field name="cytokineField" indexed="true" stored="true" multiValued="true" type="Cytokine_Pass"/>
<fieldType name="Cytokine_Pass" class="solr.TextField">
    <analyzer>
    <tokenizer class="solr.KeywordTokenizerFactory" />
    </analyzer>
</fieldType>

  <field name="ColonCancerField" type="ColonCancer" indexed="true" stored="true" multiValued="true"
   termPositions="true"
   termVectors="true"
   termOffsets="true"/>
<fieldType name="ColonCancer" class="solr.TextField" sortMissingLast="true" omitNorms="true">
<analyzer>
<filter class="solr.ShingleFilterFactory"
            minShingleSize="2" maxShingleSize="5"
            outputUnigramsIfNoShingles="true"
    />
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.SynonymFilterFactory" synonyms="synonyms_ColonCancer.txt" ignoreCase="true" expand="true" tokenizerFactory="solr.KeywordTokenizerFactory"/>
    <filter class="solr.KeepWordFilterFactory"
            words="prefLabels_ColonCancer.txt" ignoreCase="true"/>
  </analyzer>
</fieldType>
<copyField source="content" dest="ColonCancerField"/>

2 个答案:

答案 0 :(得分:1)

最有可能的是,您的同义词和KeepWord列表之间出现了问题。在Admin UI中,有Analyze屏幕,您可以在其中放置原始文本和搜索字符串,并使用所选字段(ColonCancerField为您)查看两者。比赛将突出显示。

搜索的内容。对于facet,使用ColonCancerField应该对facet有效,无需任何搜索即可尝试(q = *:*)。

KeywordTokenizer根本不拆分文本,所以你应该将整个字段作为一个方面。

此外,copyText指令不会分层。因此,您无法将field1复制到field2,然后将field2复制到field3。您需要将field1复制到field2和field3。这可能是你问题的一部分。

答案 1 :(得分:0)

我决定添加一个字段(cancerTerms)并在那里添加术语。但我不是在索尔之外这样做的。我正在使用分析链并通过ScriptUpdateProcessor传递它。在这里,我可以获取分析链的结果 并将结果存储到文档中(与strField一样)。然后我在这个领域(cancerTerms)面对。这实际上给了我正确的结果,它没有给我带有问题,而不是必然或任何其他类似的问题。此外,我不存储分析链字段(我以前)。存储它是没有意义的,因为它是一个复制字段(显然复制字段只复制源文本然后将其传送到分析器,并且不能链接)。我只存储链的结果(这对于分面很有用)。

以下是我正在做的简化视图:

内容 [已复制到] - &gt; ColonCancerField (分析链[未存储, 并将生成标记化字符串]) - &gt; 传递给更新脚本<​​/ em> (已处理 每个标记为字符串)[添加到] - &gt; CancerTerms (strField)

  

id: 2040ee23-c5dc-459c-969f-2ebf6c728184

     

标题:鼻息肉中伴随哮喘的血液和粘膜嗜酸性粒细胞的免疫调节。

     

内容背景:慢性鼻 - 鼻窦炎伴鼻息肉(CRSwNP)常与哮喘有关。粘膜嗜酸性粒细胞(EO)   已发现浸润与哮喘和疾病相关   严重程度,但不一定在每个患者。其他多因素   需要免疫过程来确定疾病的内型和   对治疗的反应。目的:评价EO的免疫调节作用   根据炎症蛋白迁移和存活   CRSwNP中的概况和哮喘状态。方法:93   包括CRSwNP的患者(47名哮喘患者)。每个病人都是   根据症状严重程度和息肉大小临床分期。鼻音   收集分泌物以建立细胞因子谱。驻外办事处   从血液样本和鼻息肉中纯化出来以描绘出来   通过流式细胞术确定特异性免疫表型并确定体外EO   与哮喘状态相关的生存。结果:CRSwNP in   哮喘患者的特征是嗜酸性粒细胞增多和高   鼻腔分泌物中白细胞介素(IL)-5的水平。虽然是EOs   在粘膜迁移后表现出活化谱,有   IL-5受体-β的相对下调表达(IL-5R?)对鼻腔内EOs的影响   哮喘患者。 IL-5和IL-9的EO培养显示出一种   通过IL-5R对哮喘患者的抗细胞凋亡作用?   调制。结论:粘膜嗜酸性粒细胞增多似乎是由EO诱导的   通过调节粘附受体进行鼻诱捕。在患者中   对于哮喘,抗细胞凋亡增强了EO的参与   T辅助细胞2型细胞因子对IL-5R的协同作用?   表达。该研究首次表明IL-9参与其中   在CRSwNP的EO稳态中可以解释其低效益   一些哮喘和鼻息肉患者的抗IL-5治疗。

     

细胞因子条件: t细胞替代事实类型ii interferonc7chemokineinterleukin 17前体白细胞   mediatorinterleukinst cell替换factort cell替换factoril9   蛋白质干扰素α-5细胞因子9蛋白

     

cancerTerms:但不一定非常

     

版本 1522116540216901632

     

得分: 1.0

以下是一些代码(请原谅这些混乱。我已经包含了Solr ver.5的更改): 的 UpdateScript

/***************************UpdateScript*********************************/

    function getAnalyzerResult(analyzer, fieldName, fieldValue) {
      var result = [];
      var token_stream = analyzer.tokenStream(fieldName, new java.io.StringReader(fieldValue));//null value?
      var term_att = token_stream.getAttribute(Packages.org.apache.lucene.analysis.tokenattributes.CharTermAttribute.class);
      token_stream.reset();
      while (token_stream.incrementToken()) {
        result.push(term_att.toString());
      }
      token_stream.end();
      token_stream.close();
      return result;
    }
    function processAdd(cmd) {
      doc = cmd.solrDoc;  // org.apache.solr.common.SolrInputDocument
      id = doc.getFieldValue("id");
      logger.warn("update-script#processAdd: id=" + id);

      var content = doc.getFieldValue("content"); // Comes from /update/extract
      //facetList contains the actual facet terms
      //facetAnalyzerName contains the Analyzer name for the term vector list names. (i.e the field type)
      var facetList = ["cytokineTerms", "cancerTerms"];
      var facetAnalyzerName = ["key_phrases", "ColonCancer"];
      /*
        Loop through all of the facets, and get the analyzer and the name for the field
        Then add the terms to the document
      */
      for(var i = 0; i < facetList.length; i++){
        var analyzer = req.getCore().getLatestSchema().getFieldTypeByName(facetAnalyzerName[i]).getIndexAnalyzer();
        var terms = getAnalyzerResult(analyzer, null, content);
        for(var index = 0; index < terms.length; index++){
          doc.addField(facetList[i], terms[index]);  
        }
      }  
    }
    // The functions below must be defined, but there's rarely a need to implement
    // anything in these.
    function processDelete(cmd) {
      // no-op
    }
    function processMergeIndexes(cmd) {
      // no-op
    }
    function processCommit(cmd) {
      // no-op
    }
    function processRollback(cmd) {
      // no-op
    }
    function finish() {
      // no-op
    }
    /***************************UpdateScript*********************************/

<强> updateRequestProcessorChain

/****************updateRequestProcessorChain ***********************/
    <updateRequestProcessorChain name="script" default="true">
      <processor class="solr.StatelessScriptUpdateProcessorFactory">
        <str name="script">update-script.js</str>
        <lst name="params">
          <str name="config_param">example config parameter</str>
        </lst>
      </processor>
      <processor class="solr.LogUpdateProcessorFactory"/>
      <processor class="solr.RunUpdateProcessorFactory" />
    </updateRequestProcessorChain>
/****************updateRequestProcessorChain ***********************/

使用帖子上传

 java -Durl=http://localhost:8983/solr/Cytokine/update -Dauto -Dparams=update.chain=script -jar bin/post.jar C:/Users/Kevin/Downloads/pubmed_result.json

来源:

  1. http://lucidworks.com/blog/2013/06/27/poor-mans-entity-extraction-with-solr/
  2. https://www.youtube.com/watch?v=AXSK2RvVJsk
  3. https://wiki.apache.org/solr/ScriptUpdateProcessor 4。https://lucene.apache.org/solr/5_0_0/changes/Changes.html#v5.0.0.upgrading_from_solr_4.x
  4. https://gist.github.com/erikhatcher/50e653c1c09abb68e068
  5. 归档: https://mail-archives.apache.org/mod_mbox/lucene-solr-user/201512.mbox/%3CCAH57+p4FK=Ta84dEpUR4p0xWQ2YWkOWPpj566ZZzhdjW9F_ZJg@mail.gmail.com%3E