blob: 35b0beec2d5f7671dc4dbca7e51810e01a3a690b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.lucene.analysis.standard.StandardAnalyzer
import org.apache.lucene.document.Document
import org.apache.lucene.index.Term
import org.apache.lucene.queryparser.classic.QueryParser
import org.apache.lucene.store.FSDirectory
import org.apache.ofbiz.base.util.UtilHttp
import org.apache.ofbiz.content.search.SearchWorker
import org.apache.ofbiz.product.feature.ParametricSearch
import org.apache.lucene.search.*
import org.apache.lucene.index.DirectoryReader
import org.apache.ofbiz.base.util.UtilProperties
queryLine = parameters.queryLine
siteId = parameters.lcSiteId
searchFeature1 = (String) parameters.SEARCH_FEAT
searchFeature2 = (String) parameters.SEARCH_FEAT2
searchFeature3 = (String) parameters.SEARCH_FEAT3
featureIdByType = ParametricSearch.makeFeatureIdByTypeMap(UtilHttp.getParameterMap(request))
combQuery = new BooleanQuery()
try {
DirectoryReader reader = DirectoryReader.open(FSDirectory.open(new File(SearchWorker.getIndexPath("content")).toPath()))
searcher = new IndexSearcher(reader)
analyzer = new StandardAnalyzer()
} catch (java.io.FileNotFoundException e) {
context.errorMessageList.add(UtilProperties.getMessage("ContentErrorUiLabels", "ContentSearchNotIndexed", locale))
return
}
if (queryLine || siteId) {
Query query = null
if (queryLine) {
QueryParser parser = new QueryParser("content", analyzer)
query = parser.parse(queryLine)
combQuery.add(query, BooleanClause.Occur.MUST)
}
if (siteId) {
termQuery = new TermQuery(new Term("site", siteId.toString()))
combQuery.add(termQuery, BooleanClause.Occur.MUST)
}
}
if (searchFeature1 || searchFeature2 || searchFeature3 || !featureIdByType.isEmpty()) {
featureQuery = new BooleanQuery()
featuresRequired = BooleanClause.Occur.MUST
if ("any".equals(parameters.any_or_all)) {
featuresRequired = BooleanClause.Occur.SHOULD
}
if (searchFeature1) {
termQuery = new TermQuery(new Term("feature", searchFeature1))
featureQuery.add(termQuery, featuresRequired)
}
if (searchFeature2) {
termQuery = new TermQuery(new Term("feature", searchFeature2))
featureQuery.add(termQuery, featuresRequired)
}
if (searchFeature3) {
termQuery = new TermQuery(new Term("feature", searchFeature3))
featureQuery.add(termQuery, featuresRequired)
}
if (featureIdByType) {
featureIdByType.each { key, value ->
termQuery = new TermQuery(new Term("feature", value))
featureQuery.add(termQuery, featuresRequired)
}
combQuery.add(featureQuery, featuresRequired)
}
}
if (searcher) {
TopScoreDocCollector collector = TopScoreDocCollector.create(100) //defaulting to 100 results
searcher.search(combQuery, collector)
ScoreDoc[] hits = collector.topDocs().scoreDocs
contentList = [] as ArrayList
hitSet = [:] as HashSet
for (int start = 0; start < collector.getTotalHits(); start++) {
Document doc = searcher.doc(hits[start].doc)
contentId = doc.get("contentId")
content = from("Content").where("contentId", contentId).cache(true).queryOne()
if (!hitSet.contains(contentId)) {
contentList.add(content)
hitSet.add(contentId)
}
}
context.queryResults = contentList
}