1 # ====================================================================
2 # Licensed under the Apache License, Version 2.0 (the "License");
3 # you may not use this file except in compliance with the License.
4 # You may obtain a copy of the License at
6 # http://www.apache.org/licenses/LICENSE-2.0
8 # Unless required by applicable law or agreed to in writing, software
9 # distributed under the License is distributed on an "AS IS" BASIS,
10 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 # See the License for the specific language governing permissions and
12 # limitations under the License.
13 # ====================================================================
15 from unittest import TestCase, main
19 class SimpleSimilarity(PythonSimilarity):
21 def computeNorm(self, field, state):
24 def queryNorm(self, sumOfSquaredWeights):
30 def sloppyFreq(self, distance):
33 def idfTerms(self, terms, searcher):
36 def idf(self, docFreq, numDocs):
39 def coord(self, overlap, maxOverlap):
42 def scorePayload(self, docId, fieldName, start, end, payload,
47 class SimilarityTestCase(TestCase):
49 Unit tests ported from Java Lucene
52 def testSimilarity(self):
54 store = RAMDirectory()
55 writer = IndexWriter(store, SimpleAnalyzer(), True,
56 IndexWriter.MaxFieldLength.LIMITED)
57 writer.setSimilarity(SimpleSimilarity())
60 d1.add(Field("field", "a c", Field.Store.YES, Field.Index.ANALYZED))
63 d2.add(Field("field", "a b c", Field.Store.YES, Field.Index.ANALYZED))
65 writer.addDocument(d1)
66 writer.addDocument(d2)
70 searcher = IndexSearcher(store, True)
71 searcher.setSimilarity(SimpleSimilarity())
73 a = Term("field", "a")
74 b = Term("field", "b")
75 c = Term("field", "c")
77 class collector1(PythonCollector):
78 def collect(_self, doc, score):
79 self.assertEqual(1.0, score)
80 def setNextReader(_self, reader, docBase):
82 def acceptsDocsOutOfOrder(_self):
85 searcher.search(TermQuery(b), collector1())
89 bq.add(TermQuery(a), BooleanClause.Occur.SHOULD)
90 bq.add(TermQuery(b), BooleanClause.Occur.SHOULD)
92 class collector2(PythonCollector):
93 def collect(_self, doc, score):
94 self.assertEqual(doc + _self.base + 1, score)
95 def setNextReader(_self, reader, docBase):
97 def acceptsDocsOutOfOrder(_self):
100 searcher.search(bq, collector2())
107 class collector3(PythonCollector):
108 def collect(_self, doc, score):
109 self.assertEqual(1.0, score)
110 def setNextReader(_self, reader, docBase):
112 def acceptsDocsOutOfOrder(_self):
115 searcher.search(pq, collector3())
120 class collector4(PythonCollector):
121 def collect(_self, doc, score):
122 self.assertEqual(2.0, score)
123 def setNextReader(_self, reader, docBase):
125 def acceptsDocsOutOfOrder(_self):
128 searcher.search(pq, collector4())
131 if __name__ == "__main__":
134 if '-loop' in sys.argv:
135 sys.argv.remove('-loop')