gpt4 book ai didi

java - liferay lucene 搜索不工作

转载 作者:行者123 更新时间:2023-11-30 07:51:23 25 4
gpt4 key购买 nike

我正在尝试在 Liferay 6.2 中实现基于 Lucene 的索引和搜索。我有一个自定义服务生成器实体,我希望能够搜索该实体的所有字段。但问题是它不会搜索所有索引字段,除非我明确键入 field:value在搜索框中。看起来它只是在 liferay 默认值上搜索

Field.ASSET_CATEGORY_TITLES, Field.ASSET_TAG_NAMES, Field.COMMENTS,
Field.CONTENT, Field.DESCRIPTION, Field.PROPERTIES, Field.TITLE,
Field.URL, Field.USER_NAME

这是我的实体

<entity name="Sample" local-service="true" remote-service="true" table="sample">
<column name="uuid_" type="String" />
<column name="sampleDbId" type="long" primary="true" />
<column name="sampleCollectionDbId" type="long" />
<column name="biobankDbId" type="long" />
<column name="hashedSampleId" type="String" />
<column name="hashedIndividualId" type="String" />
<column name="materialType" type="String" />
<column name="container" type="String" />
<column name="storageTemperature" type="String" />
<column name="sampledTime" type="Date"/>
<column name="anatomicalPartOntology" type="String" />
<column name="anatomicalPartOntologyVersion" type="String" />
<column name="anatomicalPartOntologyCode" type="String" />
<column name="anatomicalPartOntologyDescription" type="String" />
<column name="anatomicalPartFreeText" type="String" />
<column name="sex" type="String" />
<column name="ageLow" type="long" />
<column name="ageHigh" type="long" />
<column name="ageUnit" type="String" />
<column name="diseaseOntology" type="String" />
<column name="diseaseOntologyVersion" type="String" />
<column name="diseaseOntologyCode" type="String" />
<column name="diseaseOntologyDescription" type="String" />
<column name="diseaseFreeText" type="String" />
<column name="countryOfOrigin" type="String" />
<finder name="uuid" return-type="Collection">
<finder-column name="uuid_" />
</finder>

</entity>

我已经成功索引了我想要搜索的所有字段,并且可以在 Luke 中看到它。

我在索引器中对其进行索引,如下所示:

@Override
protected Document doGetDocument(Object obj) throws Exception {
// TODO Auto-generated method stub
System.out.println("-----doGetDocument called------");
Sample sample = (Sample)obj;

Document document = getBaseModelDocument(PORTLET_ID, sample);

if(sample.getSampleCollectionDbId() > 0){
document.addText("sampleCollectionName", SampleCollectionLocalServiceUtil.getSampleCollection(sample.getSampleCollectionDbId()).getName());
}
document.add(new Field("biobankName", BiobankGeneralInformationLocalServiceUtil.getBiobankGeneralInformation(sample.getBiobankDbId()).getBiobankName()));
document.add(new Field("materialType", sample.getMaterialType()));
//document.addText("biobankName", BiobankGeneralInformationLocalServiceUtil.getBiobankGeneralInformation(sample.getBiobankDbId()).getBiobankName());
//document.addKeyword("materialType", sample.getMaterialType());
document.addKeyword("container", sample.getContainer());
document.addText("storageTemperature", sample.getStorageTemperature());
document.addDate("sampledTime", sample.getSampledTime());
document.addText("anatomicalPartOntology", sample.getAnatomicalPartOntology());
document.addKeyword("anatomicalPartOntologyVersion", sample.getAnatomicalPartOntologyVersion());
document.addKeyword("anatomicalPartOntologyCode", sample.getAnatomicalPartOntologyCode());
document.addText("anatomicalPartOntologyDescription", sample.getAnatomicalPartOntologyDescription());
document.addText("anatomicalPartFreeText", sample.getAnatomicalPartFreeText());
document.addKeyword("sex", sample.getSex());
document.addNumber("ageLow", sample.getAgeLow());
document.addNumber("ageHigh", sample.getAgeHigh());
document.addText("ageUnit", sample.getAgeUnit());
document.addText("diseaseOntology", sample.getDiseaseOntology());
document.addKeyword("diseaseOntologyVersion", sample.getDiseaseOntologyVersion());
document.addKeyword("diseaseOntologyCode", sample.getDiseaseOntologyCode());
document.addText("diseaseOntologyDescription", sample.getDiseaseOntologyDescription());
document.addText("diseaseFreeText", sample.getDiseaseFreeText());
document.addKeyword("countryOfOrigin", sample.getCountryOfOrigin());

return document;
}

我还在我的 localserviceimpl 类中定义了 Hits 搜索方法:

public Hits search(long companyId, String keywords) throws SearchException{
System.out.println("-----SampleLocalServiceImpl search called------");

SearchContext searchContext = new SearchContext();
searchContext.setAndSearch(false);


Map<String, Serializable> attributes = new HashMap<String, Serializable>();

attributes.put("sampleCollectionName", keywords);
attributes.put("biobankName", keywords);
attributes.put("materialType", keywords);
attributes.put("container", keywords);
attributes.put("storageTemperature", keywords);
attributes.put("sampledTime", keywords);
attributes.put("anatomicalPartOntology", keywords);
attributes.put("anatomicalPartOntologyVersion", keywords);
attributes.put("anatomicalPartOntologyCode", keywords);
attributes.put("anatomicalPartOntologyDescription", keywords);
attributes.put("anatomicalPartFreeText", keywords);
attributes.put("sex", keywords);
attributes.put("ageLow", keywords);
attributes.put("ageHigh", keywords);
attributes.put("ageUnit", keywords);
attributes.put("diseaseOntology", keywords);
attributes.put("diseaseOntologyVersion", keywords);
attributes.put("diseaseOntologyCode", keywords);
attributes.put("diseaseOntologyDescription", keywords);
attributes.put("diseaseFreeText", keywords);
attributes.put("countryOfOrigin", keywords);

searchContext.setAttributes(attributes);
searchContext.setCompanyId(companyId);
searchContext.setKeywords(keywords);
System.out.println(searchContext.getAttributes());

QueryConfig queryConfig = new QueryConfig();

queryConfig.setHighlightEnabled(false);
queryConfig.setScoreEnabled(false);
//searchContext.setAttribute("materialType:", keywords);
searchContext.setQueryConfig(queryConfig);

System.out.println(searchContext.getCompanyId());
Indexer indexer = IndexerRegistryUtil.nullSafeGetIndexer(
Sample.class);
System.out.println("-----SampleLocalServiceImpl search called------"+indexer.getFullQuery(searchContext));
System.out.println("-----SampleLocalServiceImpl search called------"+indexer);


return indexer.search(searchContext);
}

我通过 localserviceutil 类从我的 jsp 调用此搜索方法。

所以当我输入blood时在搜索框中,我没有得到任何结果,但是当我输入 materialType:blood 时我得到结果。

  • 对于空搜索,查询日志给了我 +(+((+(entryClassName:com.xxx.portlet.xxx.model.Sample)))) (给出完整的结果集)
  • 如果我输入血液,查询日志会告诉我

    +(+((+(entryClassName:com.xxx.portlet.xxx.model.Sample)))) +(assetCategoryTitles:*blood* assetTagNames:*blood* comments:blood content:blood description:blood properties:blood title:blood
    url:blood userName:*blood*)

    (空结果集)

  • 如果我输入materialType:blood,查询日志会给出 +(+((+(entryClassName:com.xxx.portlet.xxx.model.Sample))))
    +(materialType:*blood* materialType:blood)
    (匹配结果集)

我想要的是用户能够仅在框中键入自由文本并获取匹配结果。但目前这还不起作用,因为自由文本搜索只是在 liferay 默认字段上搜索。我该如何解决这个问题?

问题也发布了here .

最佳答案

localserviceimpl 类的 Hits 搜索方法 中设置 searchContext.setAttributes(attributes); 还不够。我还必须重写 indexer 类中的 postProcessSearchQuery 方法。因此,在我的 indexer 类中添加以下方法后,我就开始工作了。

    @Override
public void postProcessSearchQuery(BooleanQuery searchQuery, SearchContext searchContext)
throws Exception {
System.out.println("-----postProcessSearchQuery called------");

addSearchTerm(searchQuery, searchContext, "sampleCollectionName", true);
addSearchTerm(searchQuery, searchContext, "biobankName", true);
addSearchTerm(searchQuery, searchContext, "materialType", true);
addSearchTerm(searchQuery, searchContext, "container", true);
addSearchTerm(searchQuery, searchContext, "storageTemperature", true);
.....
.....

LinkedHashMap<String, Object> params =
(LinkedHashMap<String, Object>)searchContext.getAttribute("params");

if (params != null) {
String expandoAttributes = (String)params.get("expandoAttributes");

if (Validator.isNotNull(expandoAttributes)) {
addSearchExpando(searchQuery, searchContext, expandoAttributes);
}
}
}

关于java - liferay lucene 搜索不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33305078/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com