¿Cómo habilitar los resultados fonéticos cuando se usa palabras clave?
-
16-10-2019 - |
Pregunta
Parece que no puedo obtener una consulta de palabras clave personalizada para devolver los resultados fonéticos al buscar personas.
Tengo una búsqueda rápida instalada, y si hago una búsqueda de personas (en el centro de búsqueda rápida) para "Jon", obtengo los resultados esperados que contienen "Jon" y "John". Sin embargo, si construyo una consulta de palabras clave (como se muestra a continuación) solo devuelve los resultados para "Jon".
¿Alguna sugerencia?
using (SPSite spSite = new SPSite("http://localhost"))
{
// get the query and settings service proxy
SearchQueryAndSiteSettingsServiceProxy settingsProxy = spSite.WebApplication.Farm.ServiceProxies.GetValue<SearchQueryAndSiteSettingsServiceProxy>();
// get the search service application proxy by name
SearchServiceApplicationProxy proxy = settingsProxy.ApplicationProxies.GetValue<SearchServiceApplicationProxy>("FAST Query SSA");
KeywordQuery keywordQuery = new KeywordQuery(proxy);
keywordQuery.RowLimit = 100;
keywordQuery.EnablePhonetic = true;
keywordQuery.EnableNicknames = true;
keywordQuery.ResultsProvider = SearchProvider.SharepointSearch;
keywordQuery.ResultTypes = ResultType.RelevantResults;
keywordQuery.SelectProperties.Add("firstname");
keywordQuery.SelectProperties.Add("lastname");
keywordQuery.QueryText = "jon";
ResultTableCollection fullTextSearchResults = keywordQuery.Execute();
if (fullTextSearchResults.Exists(ResultType.RelevantResults))
{
ResultTable searchResult = fullTextSearchResults[ResultType.RelevantResults];
Console.WriteLine("Total Rows: " + searchResult.TotalRows) ;
Console.WriteLine("Total Row Count: " + searchResult.RowCount);
Console.WriteLine("Total Rows Including Duplicates: " + searchResult.TotalRowsIncludingDuplicates);
Console.WriteLine("Is Total Rows Exact: " + searchResult.IsTotalRowsExact);
}
}
Solución
encontré un blog donde alguien hizo referencia al hecho de que necesita establecer el RankingModelId
en la palabra clave. Esto funciona para el código de muestra que ve arriba, así como para la parte web de coreSearchResults personalizada que he creado.
Aquí está el código de ejemplo:
using (SPSite spSite = new SPSite("http://localhost"))
{
SearchQueryAndSiteSettingsServiceProxy settingsProxy = spSite.WebApplication.Farm.ServiceProxies.GetValue<SearchQueryAndSiteSettingsServiceProxy>();
SearchServiceApplicationProxy proxy = settingsProxy.ApplicationProxies.GetValue<SearchServiceApplicationProxy>("FAST Query SSA");
KeywordQuery keywordQuery = new KeywordQuery(proxy);
keywordQuery.RowLimit = 100;
keywordQuery.EnablePhonetic = true;
keywordQuery.EnableNicknames = true;
keywordQuery.ResultsProvider = SearchProvider.SharepointSearch;
keywordQuery.RankingModelId = "D9BFB1A1-9036-4627-83B2-BBD9983AC8A1";
keywordQuery.ResultTypes = ResultType.RelevantResults;
keywordQuery.SelectProperties.Add("firstname");
keywordQuery.SelectProperties.Add("lastname");
keywordQuery.QueryText = "jon";
ResultTableCollection fullTextSearchResults = keywordQuery.Execute();
if (fullTextSearchResults.Exists(ResultType.RelevantResults))
{
ResultTable searchResult = fullTextSearchResults[ResultType.RelevantResults];
Console.WriteLine("Total Rows: " + searchResult.TotalRows) ;
Console.WriteLine("Total Row Count: " + searchResult.RowCount);
Console.WriteLine("Total Rows Including Duplicates: " + searchResult.TotalRowsIncludingDuplicates);
Console.WriteLine("Is Total Rows Exact: " + searchResult.IsTotalRowsExact);
}
}
Otros consejos
¿Qué hay de cambiar el valor de resultados de resultados a "FastSearch"?
Para cualquiera que intente hacer esto a través de un servicio web, el elemento que necesitará se nombra RelevanceModel
en vez de RankingModelId
Estaba atrapado tratando de hacer que funcionara a través de jQuery y Spservices Hasta que encontré el Microsoft.search.Query Schema referencia y descubrió que el nombre del elemento es RelevanceModel
Al hacer llamadas de servicio web. La referencia no menciona EnableNicknames
o EnablePhonetic
, pero descubrí que también eran necesarios para que esto funcione.
Aquí está la consulta XML con la que terminé:
<QueryPacket Revision="1000">'
<Query>
<Context>
<QueryText language="en-US" type="STRING">Jon scope:"People" </QueryText>
</Context>
<SupportedFormats Format="urn:Microsoft.Search.Response.Document.Document" />
<ResultProvider>SharepointSearch</ResultProvider>
<EnableNicknames>true</EnableNicknames>
<EnablePhonetic>true</EnablePhonetic>
<RelevanceModel>d9bfb1a1-9036-4627-83b2-bbd9983ac8a1</RelevanceModel>
<Properties>
...
<Property name="FirstName" />
<Property name="LastName" />
</Properties>
</Query>
</QueryPacket>