summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStephane Gamard <stephane.gamard@searchbox.com>2014-06-05 15:03:30 +0200
committerStephane Gamard <stephane.gamard@searchbox.com>2014-06-05 15:18:47 +0200
commit0d72c0223dfb519293948a2666df5466ec208652 (patch)
treefc7ea126e96269bc22f0786846fd39777543794c
parent3997684e743741660d111653e04606f9704ea87f (diff)
downloadsonarqube-0d72c0223dfb519293948a2666df5466ec208652.tar.gz
sonarqube-0d72c0223dfb519293948a2666df5466ec208652.zip
SONAR-5364 - Generated weighted phraseQueries for Coding Rules.
-rw-r--r--sonar-server/src/main/java/org/sonar/server/log/index/LogIndex.java5
-rw-r--r--sonar-server/src/main/java/org/sonar/server/qualityprofile/index/ActiveRuleIndex.java5
-rw-r--r--sonar-server/src/main/java/org/sonar/server/rule/index/RuleIndex.java67
-rw-r--r--sonar-server/src/main/java/org/sonar/server/search/BaseIndex.java5
-rw-r--r--sonar-server/src/test/java/org/sonar/server/search/BaseIndexTest.java3
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;