source: main/trunk/greenstone3/src/java/org/greenstone/gsdl3/service/SharedSoleneGS2FieldSearch.java@ 29143

Last change on this file since 29143 was 29143, checked in by ak19, 10 years ago

Part of port from lucene3.3.0 to lucene4.7.2. LuceneWrapper related. Changes to Greenstone3's main src code, build.xml and .classpath file, to swith over from using Lucene3Wrapper to Lucene4Wrapper

  • Property svn:executable set to *
File size: 7.2 KB
Line 
1/*
2 * SharedSoleneGS2FieldSearch.java -- shared base code for Solr and Lucene
3 * Copyright (C) 2006 New Zealand Digital Library, http://www.nzdl.org
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19package org.greenstone.gsdl3.service;
20
21// Greenstone classes
22import java.util.ArrayList;
23
24import org.apache.log4j.Logger;
25import org.greenstone.LuceneWrapper4.SharedSoleneQuery;
26import org.greenstone.gsdl3.util.GSXML;
27import org.greenstone.gsdl3.util.XMLConverter;
28
29import org.w3c.dom.Document;
30import org.w3c.dom.Element;
31import org.w3c.dom.NodeList;
32
33// Shared code for Solr and Lucene GS2FieldSearch
34
35public abstract class SharedSoleneGS2FieldSearch extends AbstractGS2FieldSearch
36{
37
38 protected static String RANK_PARAM_RANK = "rank";
39 protected static String RANK_PARAM_NONE = "none";
40
41 protected static final String SORT_ELEM = "sort";
42 protected static final String SORT_ORDER_PARAM = "sortOrder";
43 protected static final String SORT_ORDER_DESCENDING = "1";
44 protected static final String SORT_ORDER_ASCENDING = "0";
45
46 static Logger logger = Logger.getLogger(org.greenstone.gsdl3.service.SharedSoleneGS2FieldSearch.class.getName());
47
48 protected SharedSoleneQuery solene_src = null;
49
50
51 public SharedSoleneGS2FieldSearch()
52 {
53 super();
54 // Lucene/Solr uses double operators, not single
55 AND_OPERATOR = "&&";
56 OR_OPERATOR = "||";
57
58 does_paging = true;
59 does_chunking = true;
60 paramDefaults.put(SORT_ORDER_PARAM, SORT_ORDER_DESCENDING);
61 }
62
63 /** configure this service */
64 public boolean configure(Element info, Element extra_info)
65 {
66 if (!super.configure(info, extra_info))
67 {
68 return false;
69 }
70
71 // the search element
72 Element config_search = (Element) GSXML.getChildByTagName(extra_info, GSXML.SEARCH_ELEM);
73 Document owner = info.getOwnerDocument();
74 // find the sort fields in serviceRack xml, and add in the deisplayItems if any
75 NodeList sort_nodes = info.getElementsByTagName(SORT_ELEM);
76
77 for (int i = 0; i < sort_nodes.getLength(); i++)
78 {
79 Element sort = (Element) sort_nodes.item(i);
80 String name = sort.getAttribute(GSXML.NAME_ATT);
81 Element node_extra = GSXML.getNamedElement(config_search, SORT_ELEM, GSXML.NAME_ATT, name);
82 if (node_extra == null)
83 {
84 logger.error("haven't found extra info for sort field named " + name);
85 continue;
86 }
87
88 // get the display elements if any - displayName
89 NodeList display_names = node_extra.getElementsByTagName(GSXML.DISPLAY_TEXT_ELEM);
90 if (display_names != null)
91 {
92 for (int j = 0; j < display_names.getLength(); j++)
93 {
94 Element e = (Element) display_names.item(j);
95 sort.appendChild(owner.importNode(e, true));
96 }
97 }
98 } // for each sortfield
99 // Lucene/Solr doesn't do case folding or stemming or accent folding at the
100 // moment
101 does_case = false;
102 does_stem = false;
103 does_accent = false;
104
105 return true;
106 }
107
108 /** add in the Lucene/Solr specific params to TextQuery */
109 protected void addCustomQueryParams(Element param_list, String lang)
110 {
111 super.addCustomQueryParams(param_list, lang);
112 /** Lucene's/Solr's rank (sort) param is based on sort fields, not ranked/not */
113 createParameter(RANK_PARAM, param_list, lang);
114 createParameter(SORT_ORDER_PARAM, param_list, lang);
115 }
116
117 /** create a param and add to the list */
118 /** we override this to do a special rank param */
119 protected void createParameter(String name, Element param_list, String lang)
120 {
121 Document doc = param_list.getOwnerDocument();
122 Element param = null;
123 String param_default = paramDefaults.get(name);
124 if (name.equals(RANK_PARAM))
125 {
126 // get the fields
127 ArrayList<String> fields = new ArrayList<String>();
128 ArrayList<String> field_names = new ArrayList<String>();
129 if (!getSortData(fields, field_names, lang)) {
130 fields.add(RANK_PARAM_RANK);
131 fields.add(RANK_PARAM_NONE);
132 field_names.add(getTextString("param." + RANK_PARAM + "." + RANK_PARAM_RANK, lang));
133 field_names.add(getTextString("param." + RANK_PARAM + "." + RANK_PARAM_NONE, lang));
134 }
135
136 param = GSXML.createParameterDescription2(doc, name, getTextString("param." + name, lang), GSXML.PARAM_TYPE_ENUM_SINGLE, fields.get(0), fields, field_names);
137
138 } else if (name.equals(SORT_ORDER_PARAM)) {
139 String[] vals = { SORT_ORDER_ASCENDING, SORT_ORDER_DESCENDING };
140 String[] vals_texts = { getTextString("param." + SORT_ORDER_PARAM + "." + SORT_ORDER_ASCENDING, lang), getTextString("param." + SORT_ORDER_PARAM + "." + SORT_ORDER_DESCENDING, lang) };
141
142 param = GSXML.createParameterDescription(doc, SORT_ORDER_PARAM, getTextString("param." + SORT_ORDER_PARAM, lang), GSXML.PARAM_TYPE_ENUM_SINGLE, SORT_ORDER_DESCENDING, vals, vals_texts);
143 }
144
145 if (param != null)
146 {
147 param_list.appendChild(param);
148 }
149 else
150 {
151 super.createParameter(name, param_list, lang);
152 }
153
154 }
155
156 protected boolean getSortData(ArrayList<String> sort_ids, ArrayList<String> sort_names, String lang) {
157
158 Element sort_list = (Element) GSXML.getChildByTagName(this.config_info, SORT_ELEM + GSXML.LIST_MODIFIER);
159 if (sort_list == null) return false;
160 NodeList sorts = sort_list.getElementsByTagName(SORT_ELEM);
161 int len = sorts.getLength();
162 if (len == 0) return false;
163 for (int i = 0; i < len; i++)
164 {
165 Element sort = (Element) sorts.item(i);
166 String shortname = sort.getAttribute(GSXML.SHORTNAME_ATT);
167 sort_ids.add(shortname);
168 String display_name = GSXML.getDisplayText(sort, GSXML.DISPLAY_TEXT_NAME, lang, "en");
169 if (display_name.equals(""))
170 {
171 display_name = sort.getAttribute(GSXML.NAME_ATT);
172 if (display_name.equals(""))
173 {
174 display_name = shortname;
175 }
176 }
177 sort_names.add(display_name);
178
179 }
180 return true;
181 }
182
183 protected String addFieldInfo(String query, String field)
184 {
185 // currently, allfields (ZZ) is stored as a extra field for Lucene
186 if (field.equals(""))
187 { // || field.equals("ZZ")) {
188 return query;
189 }
190 return field + ":(" + query + ")";
191 }
192
193 protected void addQueryElem(StringBuffer s, String q, String f, String c)
194 {
195
196 String combine = "";
197 if (s.length() > 0)
198 {
199 combine = " " + c + " ";
200 }
201 s.append(combine + addFieldInfo(q, f));
202 }
203
204 /** Lucene/Solr doesn't use these options at the moment */
205 protected String addStemOptions(String query, String stem, String casef, String accent)
206 {
207 return query;
208 }
209
210 /**
211 * Lucene/Solr does not use internal ids. It just uses hash ids. So we need
212 * to override these methods so no conversion is done.
213 */
214 /** convert indexer internal id to Greenstone oid */
215 protected String internalNum2OID(long docnum)
216 {
217 return Long.toString(docnum);
218 }
219
220 protected String internalNum2OID(String docnum)
221 {
222 return docnum;
223
224 }
225}
Note: See TracBrowser for help on using the repository browser.