diff options
author | Stephane Gamard <stephane.gamard@searchbox.com> | 2014-06-05 15:03:30 +0200 |
---|---|---|
committer | Stephane Gamard <stephane.gamard@searchbox.com> | 2014-06-05 15:18:47 +0200 |
commit | 0d72c0223dfb519293948a2666df5466ec208652 (patch) | |
tree | fc7ea126e96269bc22f0786846fd39777543794c | |
parent | 3997684e743741660d111653e04606f9704ea87f (diff) | |
download | sonarqube-0d72c0223dfb519293948a2666df5466ec208652.tar.gz sonarqube-0d72c0223dfb519293948a2666df5466ec208652.zip |
SONAR-5364 - Generated weighted phraseQueries for Coding Rules.
5 files changed, 52 insertions, 33 deletions
diff --git a/sonar-server/src/main/java/org/sonar/server/log/index/LogIndex.java b/sonar-server/src/main/java/org/sonar/server/log/index/LogIndex.java index 0c48b6a0922..87cc2325814 100644 --- a/sonar-server/src/main/java/org/sonar/server/log/index/LogIndex.java +++ b/sonar-server/src/main/java/org/sonar/server/log/index/LogIndex.java @@ -25,6 +25,7 @@ import org.sonar.core.cluster.WorkQueue; import org.sonar.core.log.Log; import org.sonar.core.log.db.LogDto; import org.sonar.core.log.db.LogKey; +import org.sonar.core.profiling.Profiling; import org.sonar.server.search.BaseIndex; import org.sonar.server.search.ESNode; import org.sonar.server.search.IndexDefinition; @@ -39,8 +40,8 @@ import java.util.Map; */ public class LogIndex extends BaseIndex<Log, LogDto, LogKey>{ - public LogIndex(LogNormalizer normalizer, WorkQueue workQueue, ESNode node) { - super(IndexDefinition.LOG, normalizer, workQueue, node); + public LogIndex(Profiling profiling, LogNormalizer normalizer, WorkQueue workQueue, ESNode node) { + super(IndexDefinition.LOG, normalizer, workQueue, node, profiling); } @Override diff --git a/sonar-server/src/main/java/org/sonar/server/qualityprofile/index/ActiveRuleIndex.java b/sonar-server/src/main/java/org/sonar/server/qualityprofile/index/ActiveRuleIndex.java index d34cfef7f2e..06936511e31 100644 --- a/sonar-server/src/main/java/org/sonar/server/qualityprofile/index/ActiveRuleIndex.java +++ b/sonar-server/src/main/java/org/sonar/server/qualityprofile/index/ActiveRuleIndex.java @@ -46,6 +46,7 @@ import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.SearchHit; import org.sonar.api.rule.RuleKey; import org.sonar.core.cluster.WorkQueue; +import org.sonar.core.profiling.Profiling; import org.sonar.core.qualityprofile.db.ActiveRuleDto; import org.sonar.core.qualityprofile.db.ActiveRuleKey; import org.sonar.core.qualityprofile.db.QualityProfileKey; @@ -63,8 +64,8 @@ import java.util.Map; public class ActiveRuleIndex extends BaseIndex<ActiveRule, ActiveRuleDto, ActiveRuleKey> { - public ActiveRuleIndex(ActiveRuleNormalizer normalizer, WorkQueue workQueue, ESNode node) { - super(IndexDefinition.ACTIVE_RULE, normalizer, workQueue, node); + public ActiveRuleIndex(Profiling profiling, ActiveRuleNormalizer normalizer, WorkQueue workQueue, ESNode node) { + super(IndexDefinition.ACTIVE_RULE, normalizer, workQueue, node, profiling); } @Override diff --git a/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java b/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java index fe321edf089..7a92bf65ec5 100644 --- a/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java +++ b/sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java @@ -25,8 +25,10 @@ import org.elasticsearch.action.search.SearchResponse; import org.elasticsearch.common.settings.ImmutableSettings; import org.elasticsearch.common.settings.Settings; import org.elasticsearch.index.query.BoolFilterBuilder; +import org.elasticsearch.index.query.BoolQueryBuilder; import org.elasticsearch.index.query.FilterBuilder; import org.elasticsearch.index.query.FilterBuilders; +import org.elasticsearch.index.query.MatchQueryBuilder; import org.elasticsearch.index.query.QueryBuilder; import org.elasticsearch.index.query.QueryBuilders; import org.elasticsearch.search.aggregations.AggregationBuilders; @@ -37,6 +39,8 @@ import org.elasticsearch.search.sort.SortOrder; import org.sonar.api.rule.RuleKey; import org.sonar.api.rule.RuleStatus; import org.sonar.core.cluster.WorkQueue; +import org.sonar.core.profiling.Profiling; +import org.sonar.core.profiling.StopWatch; import org.sonar.core.rule.RuleDto; import org.sonar.server.qualityprofile.index.ActiveRuleNormalizer; import org.sonar.server.rule.Rule; @@ -57,8 +61,8 @@ import java.util.Set; public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> { - public RuleIndex(RuleNormalizer normalizer, WorkQueue workQueue, ESNode node) { - super(IndexDefinition.RULE, normalizer, workQueue, node); + public RuleIndex(Profiling profiling, RuleNormalizer normalizer, WorkQueue workQueue, ESNode node) { + super(IndexDefinition.RULE, normalizer, workQueue, node, profiling); } protected String getKeyValue(RuleKey key) { @@ -143,35 +147,42 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> { return esSearch; } + private QueryBuilder phraseQuery(IndexField field, String query, float boost) { + return QueryBuilders.matchPhraseQuery(field.field() + "." + IndexField.SEARCH_WORDS_SUFFIX, query) + .boost(boost) + .operator(MatchQueryBuilder.Operator.AND); + } + + private QueryBuilder termQuery(IndexField field, String query, float boost) { + return QueryBuilders.multiMatchQuery(query, + field.field(), field.field() + "." + IndexField.SEARCH_PARTIAL_SUFFIX) + .operator(MatchQueryBuilder.Operator.AND) + .boost(boost); + + } + /* Build main query (search based) */ protected QueryBuilder getQuery(RuleQuery query, QueryOptions options) { - QueryBuilder qb; - //TODO Optimize this. This is plain vanilla match no weight -> bad... if (query.getQueryText() != null && !query.getQueryText().isEmpty()) { - qb = QueryBuilders.multiMatchQuery(query.getQueryText(), - RuleNormalizer.RuleField.NAME.field(), - RuleNormalizer.RuleField.NAME.field() + "." + IndexField.SEARCH_PARTIAL_SUFFIX, - RuleNormalizer.RuleField.NAME.field() + "." + IndexField.SEARCH_WORDS_SUFFIX, - RuleNormalizer.RuleField.HTML_DESCRIPTION.field(), - RuleNormalizer.RuleField.HTML_DESCRIPTION.field() + "." + IndexField.SEARCH_WORDS_SUFFIX, - RuleNormalizer.RuleField.KEY.field(), - RuleNormalizer.RuleField.KEY.field() + "." + IndexField.SEARCH_PARTIAL_SUFFIX, - RuleNormalizer.RuleField.KEY.field() + "." + IndexField.SEARCH_WORDS_SUFFIX, - RuleNormalizer.RuleField.LANGUAGE.field(), - RuleNormalizer.RuleField.CHARACTERISTIC.field(), - RuleNormalizer.RuleField.CHARACTERISTIC.field() + "." + IndexField.SEARCH_PARTIAL_SUFFIX, - RuleNormalizer.RuleField.CHARACTERISTIC.field() + "." + IndexField.SEARCH_WORDS_SUFFIX, - RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field(), - RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field() + "." + IndexField.SEARCH_PARTIAL_SUFFIX, - RuleNormalizer.RuleField.SUB_CHARACTERISTIC.field() + "." + IndexField.SEARCH_WORDS_SUFFIX, - RuleNormalizer.RuleField._TAGS.field(), - RuleNormalizer.RuleField._TAGS.field() + "." + IndexField.SEARCH_PARTIAL_SUFFIX, - RuleNormalizer.RuleField._TAGS.field() + "." + IndexField.SEARCH_WORDS_SUFFIX - ); - } else { - qb = QueryBuilders.matchAllQuery(); + BoolQueryBuilder qb = QueryBuilders.boolQuery(); + String queryString = query.getQueryText(); + + // Human readable type of querying + qb.should(this.phraseQuery(RuleNormalizer.RuleField.KEY, queryString, 15f)); + qb.should(this.phraseQuery(RuleNormalizer.RuleField.NAME, queryString, 20f)); + qb.should(this.phraseQuery(RuleNormalizer.RuleField.HTML_DESCRIPTION, queryString, 3f)); + + // Match and partial Match queries + qb.should(this.termQuery(RuleNormalizer.RuleField.KEY, queryString, 15f)); + qb.should(this.termQuery(RuleNormalizer.RuleField.LANGUAGE, queryString, 3f)); + qb.should(this.termQuery(RuleNormalizer.RuleField.CHARACTERISTIC, queryString, 5f)); + qb.should(this.termQuery(RuleNormalizer.RuleField.SUB_CHARACTERISTIC, queryString, 5f)); + qb.should(this.termQuery(RuleNormalizer.RuleField._TAGS, queryString, 10f)); + + return qb; + } - return qb; + return QueryBuilders.matchAllQuery(); } /* Build main filter (match based) */ @@ -271,11 +282,13 @@ public class RuleIndex extends BaseIndex<Rule, RuleDto, RuleKey> { } public RuleResult search(RuleQuery query, QueryOptions options) { + StopWatch profile = profiling.start("es", Profiling.Level.FULL); SearchRequestBuilder esSearch = this.buildRequest(query, options); FilterBuilder fb = this.getFilter(query, options); QueryBuilder qb = this.getQuery(query, options); esSearch.setQuery(QueryBuilders.filteredQuery(qb, fb)); SearchResponse esResult = esSearch.get(); + profile.stop("query: {}\nresult:{}", esSearch, esResult); return new RuleResult(esResult); } diff --git a/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java b/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java index e601b6d98fc..d8a9e75aada 100644 --- a/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java +++ b/sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java @@ -36,6 +36,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.sonar.core.cluster.WorkQueue; import org.sonar.core.persistence.Dto; +import org.sonar.core.profiling.Profiling; import javax.annotation.Nullable; import java.io.IOException; @@ -55,12 +56,14 @@ public abstract class BaseIndex<DOMAIN, DTO extends Dto<KEY>, KEY extends Serial private final ESNode node; private final BaseNormalizer<DTO, KEY> normalizer; private final IndexDefinition indexDefinition; + protected final Profiling profiling; protected BaseIndex(IndexDefinition indexDefinition, BaseNormalizer<DTO, KEY> normalizer, - WorkQueue workQueue, ESNode node) { + WorkQueue workQueue, ESNode node, Profiling profiling) { this.normalizer = normalizer; this.node = node; this.indexDefinition = indexDefinition; + this.profiling = profiling; } @Override diff --git a/sonar-server/src/test/java/org/sonar/server/search/BaseIndexTest.java b/sonar-server/src/test/java/org/sonar/server/search/BaseIndexTest.java index 38d443102f1..d9f6276b1e6 100644 --- a/sonar-server/src/test/java/org/sonar/server/search/BaseIndexTest.java +++ b/sonar-server/src/test/java/org/sonar/server/search/BaseIndexTest.java @@ -31,6 +31,7 @@ import org.junit.rules.TemporaryFolder; import org.sonar.api.config.Settings; import org.sonar.api.platform.ServerFileSystem; import org.sonar.core.cluster.NullQueue; +import org.sonar.core.profiling.Profiling; import java.io.File; import java.io.IOException; @@ -85,7 +86,7 @@ public class BaseIndexTest { private BaseIndex getIndex(final ESNode esNode) { BaseIndex index = new BaseIndex( IndexDefinition.TEST, - null, new NullQueue(), esNode) { + null, new NullQueue(), esNode, new Profiling(new Settings())) { @Override protected String getKeyValue(Serializable key) { return null; |