224
def __init__(self, indexer=None):
226
indexer = self._make_indexer()
227
self.indexer = indexer
230
def _make_indexer(self):
231
indexer = xappy.IndexerConnection(CHARM_INDEX_DIR)
232
indexer.add_field_action('owner', xappy.FieldActions.INDEX_EXACT)
233
indexer.add_field_action('series', xappy.FieldActions.INDEX_EXACT)
234
indexer.add_field_action('subordinate', xappy.FieldActions.INDEX_EXACT)
235
indexer.add_field_action('provides', xappy.FieldActions.INDEX_EXACT)
236
indexer.add_field_action('requires', xappy.FieldActions.INDEX_EXACT)
239
indexer.add_field_action('name', xappy.FieldActions.STORE_CONTENT)
240
indexer.add_field_action('store_url', xappy.FieldActions.STORE_CONTENT)
241
indexer.add_field_action('summary', xappy.FieldActions.STORE_CONTENT)
242
indexer.add_field_action('short_url', xappy.FieldActions.STORE_CONTENT)
243
indexer.add_field_action('label', xappy.FieldActions.STORE_CONTENT)
244
indexer.add_field_action('series', xappy.FieldActions.STORE_CONTENT)
245
indexer.add_field_action('owner', xappy.FieldActions.STORE_CONTENT)
246
indexer.add_field_action(
247
'subordinate', xappy.FieldActions.STORE_CONTENT)
249
# Full text search fields
250
indexer.add_field_action(
251
'name', xappy.FieldActions.INDEX_FREETEXT, weight=10,
254
indexer.add_field_action(
255
'summary', xappy.FieldActions.INDEX_FREETEXT, weight=5,
258
indexer.add_field_action(
259
'description', xappy.FieldActions.INDEX_FREETEXT, weight=3,
262
indexer.add_field_action(
263
'config', xappy.FieldActions.INDEX_FREETEXT, language='en')
265
indexer.add_field_action(
266
'relations', xappy.FieldActions.INDEX_FREETEXT, language='en')
268
indexer.add_field_action(
269
'changes', xappy.FieldActions.INDEX_FREETEXT, language='en')
271
def index_charm(self, charm):
272
doc = xappy.UnprocessedDocument()
274
# Weight critical fields higher for official charms.
275
if charm['owner'] == 'charmers':
279
doc.fields.append(xappy.Field(
280
"name", charm["name"], weight=weight))
281
doc.fields.append(xappy.Field(
282
"summary", charm["summary"], weight=weight))
283
doc.fields.append(xappy.Field(
284
"description", charm["description"], weight=weight))
286
doc.fields.append(xappy.Field("owner", charm["owner"]))
287
doc.fields.append(xappy.Field("short_url", charm["short_url"]))
288
doc.fields.append(xappy.Field("label", charm["label"]))
289
doc.fields.append(xappy.Field("series", charm["series"]))
291
if charm.get('subordinate'):
292
doc.fields.append(xappy.Field('subordinate', 'true'))
294
if "config" in charm \
295
and charm['config'] \
296
and 'options' in charm['config'] \
297
and charm['config']['options']:
300
for key, option in charm["config"]["options"].items():
301
config_text.append(key)
302
config_text.append(option.get("description", ""))
303
doc.fields.append(xappy.Field("config", " ".join(config_text)))
307
if "requires" in charm and charm["requires"]:
308
for key, option in charm["requires"].items():
309
relation_text.append(key)
310
relation_text.append(option["interface"])
311
doc.fields.append(xappy.Field('requires', option["interface"]))
312
if "provides" in charm and charm["provides"]:
313
for key, option in charm["provides"].items():
314
if not isinstance(option, dict):
316
"invalid charm provides %s", charm['branch_spec'])
318
relation_text.append(key)
319
relation_text.append(option["interface"])
320
doc.fields.append(xappy.Field("provides", option["interface"]))
324
xappy.Field("relations", " ".join(relation_text)))
327
for change in charm.get("changes", ()):
328
change_text.append(change['message'])
329
change_text.append(change['committer'])
332
doc.fields.append(xappy.Field("changes", " ".join(change_text)))
334
if 'store_url' in charm:
335
doc.fields.append(xappy.Field('store_url', charm['store_url']))
337
self.log.warning("No store url found for %s", charm["_id"])
338
doc.id = charm["_id"]
339
self.indexer.replace(doc)
343
220
class IndexIngestJob(IngestJob):