Apply boost values to search queries
This commit is contained in:
@@ -39,7 +39,7 @@ public enum IndexType {
|
|||||||
FieldNames.TITLE,
|
FieldNames.TITLE,
|
||||||
FieldNames.ARTIST),
|
FieldNames.ARTIST),
|
||||||
boosts(
|
boosts(
|
||||||
entry(FieldNames.TITLE, 2F))),
|
entry(FieldNames.TITLE, 1.1F))),
|
||||||
|
|
||||||
ALBUM(
|
ALBUM(
|
||||||
fieldNames(
|
fieldNames(
|
||||||
@@ -47,7 +47,7 @@ public enum IndexType {
|
|||||||
FieldNames.ARTIST),
|
FieldNames.ARTIST),
|
||||||
// FieldNames.FOLDER), // XXX 3.x -> 8.x : Remove folder from multi-field search condition
|
// FieldNames.FOLDER), // XXX 3.x -> 8.x : Remove folder from multi-field search condition
|
||||||
boosts(
|
boosts(
|
||||||
entry(FieldNames.ALBUM, 2F))),
|
entry(FieldNames.ALBUM, 1.1F))),
|
||||||
|
|
||||||
ALBUM_ID3(
|
ALBUM_ID3(
|
||||||
fieldNames(
|
fieldNames(
|
||||||
@@ -55,20 +55,18 @@ public enum IndexType {
|
|||||||
FieldNames.ARTIST),
|
FieldNames.ARTIST),
|
||||||
// FieldNames.FOLDER_ID), // XXX 3.x -> 8.x : Remove folder from multi-field search condition
|
// FieldNames.FOLDER_ID), // XXX 3.x -> 8.x : Remove folder from multi-field search condition
|
||||||
boosts(
|
boosts(
|
||||||
entry(FieldNames.ALBUM, 2F))),
|
entry(FieldNames.ALBUM, 1.1F))),
|
||||||
|
|
||||||
ARTIST(
|
ARTIST(
|
||||||
fieldNames(
|
fieldNames(
|
||||||
FieldNames.ARTIST),
|
FieldNames.ARTIST),
|
||||||
// FieldNames.FOLDER), // XXX 3.x -> 8.x : Remove folder from multi-field search condition
|
// FieldNames.FOLDER), // XXX 3.x -> 8.x : Remove folder from multi-field search condition
|
||||||
boosts(
|
boosts()),
|
||||||
entry(FieldNames.ARTIST, 1F))),
|
|
||||||
|
|
||||||
ARTIST_ID3(
|
ARTIST_ID3(
|
||||||
fieldNames(
|
fieldNames(
|
||||||
FieldNames.ARTIST),
|
FieldNames.ARTIST),
|
||||||
boosts(
|
boosts()),
|
||||||
entry(FieldNames.ARTIST, 2F))),
|
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import org.apache.lucene.document.IntPoint;
|
|||||||
import org.apache.lucene.index.Term;
|
import org.apache.lucene.index.Term;
|
||||||
import org.apache.lucene.search.BooleanClause.Occur;
|
import org.apache.lucene.search.BooleanClause.Occur;
|
||||||
import org.apache.lucene.search.BooleanQuery;
|
import org.apache.lucene.search.BooleanQuery;
|
||||||
|
import org.apache.lucene.search.BoostQuery;
|
||||||
import org.apache.lucene.search.Query;
|
import org.apache.lucene.search.Query;
|
||||||
import org.apache.lucene.search.TermQuery;
|
import org.apache.lucene.search.TermQuery;
|
||||||
import org.apache.lucene.search.WildcardQuery;
|
import org.apache.lucene.search.WildcardQuery;
|
||||||
@@ -101,7 +102,8 @@ public class QueryFactory {
|
|||||||
* - Self made parser process reduces one library dependency.
|
* - Self made parser process reduces one library dependency.
|
||||||
* - It is easy to make corrections later when changing the query to improve search accuracy.
|
* - It is easy to make corrections later when changing the query to improve search accuracy.
|
||||||
*/
|
*/
|
||||||
private Query createMultiFieldWildQuery(@NonNull String[] fieldNames, @NonNull String queryString)
|
private Query createMultiFieldWildQuery(@NonNull String[] fieldNames, @NonNull String queryString,
|
||||||
|
@NonNull IndexType indexType)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
BooleanQuery.Builder mainQuery = new BooleanQuery.Builder();
|
BooleanQuery.Builder mainQuery = new BooleanQuery.Builder();
|
||||||
@@ -117,8 +119,12 @@ public class QueryFactory {
|
|||||||
while (stream.incrementToken()) {
|
while (stream.incrementToken()) {
|
||||||
String token = stream.getAttribute(CharTermAttribute.class).toString();
|
String token = stream.getAttribute(CharTermAttribute.class).toString();
|
||||||
WildcardQuery wildcardQuery = new WildcardQuery(new Term(fieldName, token.concat(ASTERISK)));
|
WildcardQuery wildcardQuery = new WildcardQuery(new Term(fieldName, token.concat(ASTERISK)));
|
||||||
|
if (indexType.getBoosts().containsKey(fieldName)) {
|
||||||
|
fieldQuerys.add(new BoostQuery(wildcardQuery, indexType.getBoosts().get(fieldName)));
|
||||||
|
} else {
|
||||||
fieldQuerys.add(wildcardQuery);
|
fieldQuerys.add(wildcardQuery);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
fieldsQuerys.add(fieldQuerys);
|
fieldsQuerys.add(fieldQuerys);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -169,7 +175,7 @@ public class QueryFactory {
|
|||||||
|
|
||||||
BooleanQuery.Builder mainQuery = new BooleanQuery.Builder();
|
BooleanQuery.Builder mainQuery = new BooleanQuery.Builder();
|
||||||
|
|
||||||
Query multiFieldQuery = createMultiFieldWildQuery(indexType.getFields(), criteria.getQuery());
|
Query multiFieldQuery = createMultiFieldWildQuery(indexType.getFields(), criteria.getQuery(), indexType);
|
||||||
mainQuery.add(multiFieldQuery, Occur.MUST);
|
mainQuery.add(multiFieldQuery, Occur.MUST);
|
||||||
|
|
||||||
boolean isId3 = indexType == IndexType.ALBUM_ID3 || indexType == IndexType.ARTIST_ID3;
|
boolean isId3 = indexType == IndexType.ALBUM_ID3 || indexType == IndexType.ARTIST_ID3;
|
||||||
|
|||||||
+6
-6
@@ -123,13 +123,13 @@ public class QueryFactoryTestCase {
|
|||||||
|
|
||||||
Query query = queryFactory.search(criteria, SINGLE_FOLDERS, IndexType.ALBUM);
|
Query query = queryFactory.search(criteria, SINGLE_FOLDERS, IndexType.ALBUM);
|
||||||
assertEquals("SearchAlbum",
|
assertEquals("SearchAlbum",
|
||||||
"+((album:abc* artist:abc*) (album:def* artist:def*)) +(folder:" + PATH1
|
"+(((album:abc*)^1.1 artist:abc*) ((album:def*)^1.1 artist:def*)) +(folder:" + PATH1
|
||||||
+ ")",
|
+ ")",
|
||||||
query.toString());
|
query.toString());
|
||||||
|
|
||||||
query = queryFactory.search(criteria, MULTI_FOLDERS, IndexType.ALBUM);
|
query = queryFactory.search(criteria, MULTI_FOLDERS, IndexType.ALBUM);
|
||||||
assertEquals("SearchAlbum",
|
assertEquals("SearchAlbum",
|
||||||
"+((album:abc* artist:abc*) (album:def* artist:def*)) +(folder:" + PATH1
|
"+(((album:abc*)^1.1 artist:abc*) ((album:def*)^1.1 artist:def*)) +(folder:" + PATH1
|
||||||
+ " folder:" + PATH2 + ")",
|
+ " folder:" + PATH2 + ")",
|
||||||
query.toString());
|
query.toString());
|
||||||
}
|
}
|
||||||
@@ -143,11 +143,11 @@ public class QueryFactoryTestCase {
|
|||||||
|
|
||||||
Query query = queryFactory.search(criteria, SINGLE_FOLDERS, IndexType.SONG);
|
Query query = queryFactory.search(criteria, SINGLE_FOLDERS, IndexType.SONG);
|
||||||
assertEquals("SearchSong",
|
assertEquals("SearchSong",
|
||||||
"+((title:abc* artist:abc*) (title:def* artist:def*)) +(folder:" + PATH1 + ")",
|
"+(((title:abc*)^1.1 artist:abc*) ((title:def*)^1.1 artist:def*)) +(folder:" + PATH1 + ")",
|
||||||
query.toString());
|
query.toString());
|
||||||
|
|
||||||
query = queryFactory.search(criteria, MULTI_FOLDERS, IndexType.SONG);
|
query = queryFactory.search(criteria, MULTI_FOLDERS, IndexType.SONG);
|
||||||
assertEquals("SearchSong", "+((title:abc* artist:abc*) (title:def* artist:def*)) +(folder:" + PATH1
|
assertEquals("SearchSong", "+(((title:abc*)^1.1 artist:abc*) ((title:def*)^1.1 artist:def*)) +(folder:" + PATH1
|
||||||
+ " folder:" + PATH2 + ")", query.toString());
|
+ " folder:" + PATH2 + ")", query.toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,13 +178,13 @@ public class QueryFactoryTestCase {
|
|||||||
|
|
||||||
Query query = queryFactory.search(criteria, SINGLE_FOLDERS, IndexType.ALBUM_ID3);
|
Query query = queryFactory.search(criteria, SINGLE_FOLDERS, IndexType.ALBUM_ID3);
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"SearchAlbumId3", "+((album:abc* artist:abc*) (album:def* artist:def*)) "
|
"SearchAlbumId3", "+(((album:abc*)^1.1 artist:abc*) ((album:def*)^1.1 artist:def*)) "
|
||||||
+ "+(folderId:" + FID1 + ")",
|
+ "+(folderId:" + FID1 + ")",
|
||||||
query.toString());
|
query.toString());
|
||||||
|
|
||||||
query = queryFactory.search(criteria, MULTI_FOLDERS, IndexType.ALBUM_ID3);
|
query = queryFactory.search(criteria, MULTI_FOLDERS, IndexType.ALBUM_ID3);
|
||||||
assertEquals("SearchAlbumId3",
|
assertEquals("SearchAlbumId3",
|
||||||
"+((album:abc* artist:abc*) (album:def* artist:def*)) +(folderId:"
|
"+(((album:abc*)^1.1 artist:abc*) ((album:def*)^1.1 artist:def*)) +(folderId:"
|
||||||
+ FID1 + " folderId:"
|
+ FID1 + " folderId:"
|
||||||
+ FID2 + ")",
|
+ FID2 + ")",
|
||||||
query.toString());
|
query.toString());
|
||||||
|
|||||||
Reference in New Issue
Block a user