【问题标题】:How to access field analyzer inside SearchComponent's subclass?如何访问 SearchComponent 子类中的字段分析器?
【发布时间】:2021-04-23 13:32:23
【问题描述】:

我有这样的组件:

public class TempComponent extends SearchComponent {

    private static final Logger LOG = LoggerFactory.getLogger(SearchComponent.class);


    @Override
    public void prepare(ResponseBuilder rb) throws IOException {

        LOG.info("Temp Component ---");
        SolrIndexSearcher indexSearcher = rb.req.getSearcher();
        IndexReader reader = indexSearcher.getIndexReader();

        SolrParams params = rb.req.getParams();
        String q = params.get(CommonParams.Q);
        Query query = new TermQuery(new Term("name", q));
        DocList matchDocs = indexSearcher.getDocList(query, null, null, 0, 100000,10000);

    }
    @Override
    public void process(ResponseBuilder rb) throws IOException {

    }

    @Override
    public String getDescription() {
        return null;
    }
}

在架构中,我为字段 name 设计了新的 fieldType。

<fieldType name="nameType" class="solr.TextField" positionIncrementGap="100" multiValued="false">
    <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
  </fieldType>

<field name="name" type="nameType" multiValued="false" indexed="true"/>

在搜索索引之前,如何访问该 fieldType 的分析器并将其应用于 query(q)?

【问题讨论】:

    标签: java solr lucene


    【解决方案1】:
    public class TempComponent extends SearchComponent {
    
        private static final Logger LOG = LoggerFactory.getLogger(SearchComponent.class);
    
    
        @Override
        public void prepare(ResponseBuilder rb) throws IOException {
    
            LOG.info("Temp Component ---");
            SolrIndexSearcher indexSearcher = rb.req.getSearcher();
            IndexReader reader = indexSearcher.getIndexReader();
    
            SolrParams params = rb.req.getParams();
            String q = params.get(CommonParams.Q);
            Analyzer analyzer = rb.req.getSchema().getField("name").getType().getQueryAnalyzer();
            StandardQueryParser standardQueryParser = new StandardQueryParser();
            standardQueryParser.setAnalyzer(analyzer);
            Query query = standardQueryParser.parse(q, "name");
            DocList matchedCategories = indexSearcher.getDocList(query, null, null, 0, 100000,10000);
    
    
        }
        @Override
        public void process(ResponseBuilder rb) throws IOException {
    
        }
    
        @Override
        public String getDescription() {
            return null;
        }
    }
    

    我找到了答案!这很容易。

    【讨论】:

      猜你喜欢
      • 2020-04-27
      • 1970-01-01
      • 2015-04-16
      • 1970-01-01
      • 2011-05-29
      • 2019-03-01
      • 1970-01-01
      • 2019-07-14
      相关资源
      最近更新 更多