def test_search_q(self): solr_results = search(query={"SearchableText": "Document"}) self.assertEqual(solr_results.hits, 2) uids = [x["UID"] for x in solr_results.docs] self.assertIn(self.doc1.UID(), uids) self.assertIn(self.doc2.UID(), uids) self.assertNotIn(self.published_news.UID(), uids) self.assertNotIn(self.unpublished_doc.UID(), uids) self.assertNotIn(self.unpublished_news.UID(), uids) self.assertNotIn(self.event.UID(), uids) solr_results = search(query={"SearchableText": "lorem ipsum"}) self.assertEqual(solr_results.hits, 2) uids = [x["UID"] for x in solr_results.docs] self.assertIn(self.doc1.UID(), uids) self.assertIn(self.doc2.UID(), uids) solr_results = search(query={"SearchableText": "lorem amet"}) self.assertEqual(solr_results.hits, 1) uids = [x["UID"] for x in solr_results.docs] self.assertNotIn(self.doc1.UID(), uids) self.assertIn(self.doc2.UID(), uids) solr_results = search(query={"SearchableText": "lorem OR amet"}) self.assertEqual(solr_results.hits, 2) uids = [x["UID"] for x in solr_results.docs] self.assertIn(self.doc1.UID(), uids) self.assertIn(self.doc2.UID(), uids)
def test_maintenance_reindex(self): solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 0) self.reindex_view() solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 1) self.assertEqual(solr_results.docs[0]["UID"], self.published_doc.UID()) # now, disable solr indexer and publish other two items set_registry_record("active", False, interface=IRerSolrpushSettings) api.content.transition(obj=self.news, transition="publish") api.content.transition(obj=self.unpublished_doc, transition="publish") commit() solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 1) # now, enable and reindex set_registry_record("active", True, interface=IRerSolrpushSettings) self.reindex_view() solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") # news items are not enabled self.assertEqual(solr_results.hits, 2) self.assertEqual( set(doc["UID"] for doc in solr_results.docs), set([self.published_doc.UID(), self.unpublished_doc.UID()]), )
def test_maintenance_reindex_with_unwanted_types(self): self.reindex_view() solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 1) set_registry_record( "enabled_types", [u"Document", u"News Item"], interface=IRerSolrpushSettings, ) api.content.transition(obj=self.news, transition="publish") api.content.transition(obj=self.unpublished_doc, transition="publish") commit() solr_results = search(query={ "*": "*", "b_size": 100000 }, fl="UID,portal_type") self.assertEqual(solr_results.hits, 3) set_registry_record("enabled_types", [u"Document"], interface=IRerSolrpushSettings) self.reindex_view() solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") # News isn't removed because reindex view only reindex values from # Plone self.assertEqual(solr_results.hits, 3)
def test_search_fl(self): """ with fl we can select which fields solr returns for results """ solr_results = search(query={"*": "*"}) self.assertEqual(solr_results.hits, 3) for doc in solr_results.docs: self.assertIn("UID", list(doc.keys())) self.assertIn("Title", list(doc.keys())) solr_results = search(query={"*": "*"}, fl="UID") self.assertEqual(solr_results.hits, 3) for doc in solr_results.docs: self.assertIn("UID", list(doc.keys())) self.assertNotIn("Title", list(doc.keys())) solr_results = search(query={"*": "*"}, fl="UID Subject") self.assertEqual(solr_results.hits, 3) for doc in solr_results.docs: self.assertIn("UID", list(doc.keys())) self.assertNotIn("Title", list(doc.keys())) if not api.content.get(UID=doc["UID"]).Subject(): self.assertNotIn("Subject", list(doc.keys())) else: self.assertIn("Subject", list(doc.keys()))
def test_push_to_solr(self): solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 0) # try to push an indexable and published content push_to_solr(self.published_doc) solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 1) self.assertEqual(solr_results.docs[0]["UID"], self.published_doc.UID()) # try to push an indexable and private content push_to_solr(self.unpublished_doc) solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 1) self.assertEqual(solr_results.docs[0]["UID"], self.published_doc.UID()) # try to push a non indexable published content push_to_solr(self.published_news) solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 1) self.assertEqual(solr_results.docs[0]["UID"], self.published_doc.UID()) # try to push a non indexable private content push_to_solr(self.unpublished_news) solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 1) self.assertEqual(solr_results.docs[0]["UID"], self.published_doc.UID())
def test_search_with_elevate(self): doc3 = api.content.create(container=self.portal, type="Document", title="Third page") # page with the shortest title containing keyword has the better score doc4 = api.content.create(container=self.portal, type="Document", title="page") api.content.transition(obj=doc3, transition="publish") api.content.transition(obj=doc4, transition="publish") commit() solr_results = search(query={ "SearchableText": "page" }, fl=["UID", "Title", "[elevated]"]).docs self.assertEqual(len(solr_results), 4) self.assertEqual( solr_results[0], { "UID": doc4.UID(), "Title": doc4.Title(), "[elevated]": False }, ) # now let's set an elevate for third document value = json.dumps([{"text": [u"page"], "uid": [{"UID": doc3.UID()}]}]) if six.PY2: value = value.decode("utf-8") set_registry_record( "elevate_schema", value, interface=IElevateSettings, ) solr_results = search(query={ "SearchableText": "page" }, fl=["UID", "Title", "[elevated]"]).docs self.assertEqual(len(solr_results), 4) self.assertEqual( solr_results[0], { "UID": doc3.UID(), "Title": doc3.Title(), "[elevated]": True }, ) self.assertEqual( solr_results[1], { "UID": doc4.UID(), "Title": doc4.Title(), "[elevated]": False }, )
def test_search_bq(self): solr_results = search(query={"": "odd"}, fl=["UID", "id", "Title"]) self.assertEqual(solr_results.hits, len(self.docs) / 2) self.assertNotEqual(solr_results.docs[0]["id"], "odd") set_registry_record("bq", u"id:odd", interface=IRerSolrpushSettings) commit() solr_results = search(query={"": "odd"}, fl=["UID", "id", "Title"]) self.assertEqual(solr_results.hits, len(self.docs) / 2) self.assertEqual(solr_results.docs[0]["id"], "odd")
def test_search_qf(self): solr_results = search(query={"": "odd"}, fl=["UID", "id", "Title"]) self.assertEqual(solr_results.hits, len(self.docs) / 2) self.assertNotEqual(solr_results.docs[0]["id"], "odd") set_registry_record( "qf", u"id^1000.0 SearchableText^1.0", interface=IRerSolrpushSettings, ) commit() solr_results = search(query={"": "odd"}, fl=["UID", "id", "Title"]) self.assertEqual(solr_results.hits, len(self.docs) / 2) self.assertEqual(solr_results.docs[0]["id"], "odd")
def test_reset_solr(self): solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 0) api.content.transition(obj=self.unpublished_doc, transition="publish") # commit() # try to push an indexable and published content push_to_solr(self.published_doc) push_to_solr(self.unpublished_doc) solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 2) self.assertEqual(solr_results.docs[0]["UID"], self.published_doc.UID()) # cleanup catalog reset_solr() solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 0)
def test_maintenance_sync(self): api.content.transition(obj=self.news, transition="publish") api.content.transition(obj=self.unpublished_doc, transition="publish") set_registry_record( "enabled_types", [u"Document", u"News Item"], interface=IRerSolrpushSettings, ) self.reindex_view() solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 3) set_registry_record("enabled_types", [u"Document"], interface=IRerSolrpushSettings) self.sync_view() solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 2)
def test_search_all(self): solr_results = search(query={"*": "*"}) # only published and indexable contents are on solr self.assertEqual(solr_results.hits, 3) uids = [x["UID"] for x in solr_results.docs] self.assertIn(self.doc1.UID(), uids) self.assertIn(self.doc2.UID(), uids) self.assertIn(self.published_news.UID(), uids) self.assertNotIn(self.unpublished_doc.UID(), uids) self.assertNotIn(self.unpublished_news.UID(), uids) self.assertNotIn(self.event.UID(), uids)
def test_search_sort_on(self): """""" # update modification date time.sleep(1) self.doc2.reindexObject() commit() solr_results = search(query={ "portal_type": "Document", "sort_on": "modified" }) self.assertEqual(solr_results.hits, 2) self.assertEqual(solr_results.docs[0]["UID"], self.doc1.UID()) self.assertEqual(solr_results.docs[1]["UID"], self.doc2.UID()) solr_results = search( query={ "portal_type": "Document", "sort_on": "modified", "sort_order": "reverse", }) self.assertEqual(solr_results.hits, 2) self.assertEqual(solr_results.docs[0]["UID"], self.doc2.UID()) self.assertEqual(solr_results.docs[1]["UID"], self.doc1.UID())
def test_update_content(self): push_to_solr(self.published_doc) solr_results = search(query={ "*": "*", "b_size": 100000 }, fl="UID Description") self.assertEqual(solr_results.hits, 1) self.assertEqual(solr_results.docs[0]["UID"], self.published_doc.UID()) self.assertEqual(solr_results.docs[0].get("Description", ""), "") self.published_doc.setDescription("foo description") push_to_solr(self.published_doc) solr_results = search(query={ "*": "*", "b_size": 100000 }, fl="UID Description") self.assertEqual(solr_results.hits, 1) self.assertEqual(solr_results.docs[0]["UID"], self.published_doc.UID()) self.assertIn("Description", solr_results.docs[0]) self.assertEqual(solr_results.docs[0]["Description"], "foo description")
def test_search_words_case_insensitive(self): """because it's indexed as lowercase""" obj = api.content.create( container=self.portal, type="Document", id="insensitive", title="Insensitive", searchwords=["FOO", "bar", "bAz"], ) api.content.transition(obj=obj, transition="publish") commit() self.assertEqual( search( query={"searchwords": "FOO"}, fl=["UID", "id", "Title"] ).hits, 1, ) self.assertEqual( search( query={"searchwords": "foo"}, fl=["UID", "id", "Title"] ).hits, 1, ) self.assertEqual( search( query={"searchwords": "bar"}, fl=["UID", "id", "Title"] ).hits, 1, ) self.assertEqual( search( query={"searchwords": "Bar"}, fl=["UID", "id", "Title"] ).hits, 1, ) self.assertEqual( search( query={"searchwords": "baz"}, fl=["UID", "id", "Title"] ).hits, 1, ) self.assertEqual( search( query={"searchwords": "BAZ"}, fl=["UID", "id", "Title"] ).hits, 1, )
def get_terms(self): solr_results = search( query={ "*": "*", "b_size": 1 }, fl="UID", facets=True, facet_fields=self.facet_field, ) if isinstance(solr_results, dict) and solr_results.get("error", False): return [] facets = solr_results.facets["facet_fields"].get(self.facet_field, []) if not facets: return [] terms = [] for facet in facets: for key in facet.keys(): terms.append( SimpleTerm(value=key, token=key.encode("utf-8"), title=key)) return terms
def test_search_odd(self): solr_results = search(query={"SearchableText": "odd"}, fl="UID") self.assertEqual(solr_results.hits, len(self.docs) / 2)
def test_items_are_unindexed_when_set_false(self): self.document.showinsearch = False self.document.reindexObject() commit() solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 1)
def test_items_are_indexed_by_default(self): solr_results = search(query={"*": "*", "b_size": 100000}, fl="UID") self.assertEqual(solr_results.hits, 2)
def test_search_fq(self): # same result if we search by portal_type solr_results = search(query={"portal_type": "Document"}) self.assertEqual(solr_results.hits, 2) uids = [x["UID"] for x in solr_results.docs] self.assertIn(self.doc1.UID(), uids) self.assertIn(self.doc2.UID(), uids) self.assertNotIn(self.published_news.UID(), uids) self.assertNotIn(self.unpublished_doc.UID(), uids) self.assertNotIn(self.unpublished_news.UID(), uids) self.assertNotIn(self.event.UID(), uids) solr_results = search(query={"portal_type": "News Item"}) self.assertEqual(solr_results.hits, 1) uids = [x["UID"] for x in solr_results.docs] self.assertNotIn(self.doc1.UID(), uids) self.assertNotIn(self.doc2.UID(), uids) self.assertIn(self.published_news.UID(), uids) self.assertNotIn(self.unpublished_doc.UID(), uids) self.assertNotIn(self.unpublished_news.UID(), uids) self.assertNotIn(self.event.UID(), uids) solr_results = search(query={"Subject": "foo"}) self.assertEqual(solr_results.hits, 2) uids = [x["UID"] for x in solr_results.docs] self.assertIn(self.doc1.UID(), uids) self.assertNotIn(self.doc2.UID(), uids) self.assertIn(self.published_news.UID(), uids) self.assertNotIn(self.unpublished_doc.UID(), uids) self.assertNotIn(self.unpublished_news.UID(), uids) self.assertNotIn(self.event.UID(), uids) solr_results = search(query={"Subject": "bar"}) self.assertEqual(solr_results.hits, 1) uids = [x["UID"] for x in solr_results.docs] self.assertIn(self.doc1.UID(), uids) self.assertNotIn(self.doc2.UID(), uids) self.assertNotIn(self.published_news.UID(), uids) self.assertNotIn(self.unpublished_doc.UID(), uids) self.assertNotIn(self.unpublished_news.UID(), uids) self.assertNotIn(self.event.UID(), uids) solr_results = search(query={"Subject": ["foo", "bar"]}) self.assertEqual(solr_results.hits, 2) uids = [x["UID"] for x in solr_results.docs] self.assertIn(self.doc1.UID(), uids) self.assertNotIn(self.doc2.UID(), uids) self.assertIn(self.published_news.UID(), uids) self.assertNotIn(self.unpublished_doc.UID(), uids) self.assertNotIn(self.unpublished_news.UID(), uids) self.assertNotIn(self.event.UID(), uids) solr_results = search(query={"Subject": ["news category"]}) self.assertEqual(solr_results.hits, 1) uids = [x["UID"] for x in solr_results.docs] self.assertNotIn(self.doc1.UID(), uids) self.assertNotIn(self.doc2.UID(), uids) self.assertIn(self.published_news.UID(), uids) self.assertNotIn(self.unpublished_doc.UID(), uids) self.assertNotIn(self.unpublished_news.UID(), uids) self.assertNotIn(self.event.UID(), uids)
def test_all_items(self): solr_results = search(query={}, fl="UID") self.assertEqual(solr_results.hits, len(self.docs))