On Nov 15, 2009, at 8:16 PM, Yonik Seeley wrote:

> Let's all try to summarize changes to the wiki as we would changes to
> the code - without that it's tough to tell what the changes are.
> 
> In this particular case, I'm not sure if all of the formatting changes
> were deliberate or accidental.  If accidental, I wonder if the cause
> was a bug in GUI mode, or a bug in your browser?
> 

Hmm, that is bad.  I used GUI mode and I definitely did not make any of those 
changes.  

For the record, I added the dist, hsin, deg and rad functions.


> -Yonik
> http://www.lucidimagination.com
> 
> 
> 
> On Sat, Nov 14, 2009 at 9:05 AM, Apache Wiki <wikidi...@apache.org> wrote:
>> Dear Wiki user,
>> 
>> You have subscribed to a wiki page or wiki category on "Solr Wiki" for 
>> change notification.
>> 
>> The "FunctionQuery" page has been changed by GrantIngersoll.
>> http://wiki.apache.org/solr/FunctionQuery?action=diff&rev1=29&rev2=30
>> 
>> --------------------------------------------------
>> 
>> - FunctionQuery allows one to use the actual value of a numeric field and 
>> functions of those fields in a relevancy score.
>> + FunctionQuery allows one to use the actual value of a numeric field and 
>> functions of those fields in a relevancy score.
>> 
>>  <<TableOfContents>>
>> 
>>  = Using FunctionQuery =
>>  There are a few ways to use FunctionQuery from Solr's HTTP interface:
>> +
>>   1. Embed a FunctionQuery in a regular query expressed in SolrQuerySyntax 
>> via the _val_ hook
>>   1. Use the FunctionQParserPlugin, ie: {{{q={!func}log(foo)}}}
>>   1. Use a parameter that has an explicit type of FunctionQuery, such as 
>> DisMaxRequestHandler's '''bf''' (boost function) parameter.
>> -     * NOTE: the '''bf''' parameter actually takes a list of function 
>> queries separated by whitespace and each with an optional boost.  Make sure 
>> to eliminate any internal whitespace in single function queries when using 
>> '''bf'''.
>> +   * NOTE: the '''bf''' parameter actually takes a list of function queries 
>> separated by whitespace and each with an optional boost.  Make sure to 
>> eliminate any internal whitespace in single function queries when using 
>> '''bf'''.
>> -     * Example: {{{q=foo&bf="ord(popularity)^0.5 
>> recip(rord(price),1,1000,1000)^0.3"}}}
>> +   * Example: {{{q=foo&bf="ord(popularity)^0.5 
>> recip(rord(price),1,1000,1000)^0.3"}}}
>> 
>>  See SolrPlugins#ValueSourceParser for information on how to hook in your 
>> own FunctionQuery.
>> 
>> @@ -20, +21 @@
>> 
>>  There is currently no infix parser - functions must be expressed as 
>> function calls (e.g. sum(a,b) instead of a+b)
>> 
>>  = Available Functions =
>> -
>>  == constant ==
>> - <!> [[Solr1.3]]
>> - Floating point constants.
>> + <!> [[Solr1.3]] Floating point constants.
>> +
>> -     Example Syntax: '''1.5'''
>> +  . Example Syntax: '''1.5'''
>> -
>> -     SolrQuerySyntax Example: '''_val_:1.5'''
>> +  SolrQuerySyntax Example: '''_val_:1.5'''
>> 
>>  == fieldvalue ==
>>  This function returns the numeric field value of an indexed field with a 
>> maximum of one value per document (not multiValued).  The syntax is simply 
>> the field name by itself.  0 is returned for documents without a value in 
>> the field.
>> +
>> -     Example Syntax: '''myFloatField'''
>> +  . Example Syntax: '''myFloatField'''
>> -
>> -     SolrQuerySyntax Example: '''_val_:myFloatField'''
>> +  SolrQuerySyntax Example: '''_val_:myFloatField'''
>> 
>>  == ord ==
>>  ord(myfield) returns the ordinal of the indexed field value within the 
>> indexed list of terms for that field in lucene index order 
>> (lexicographically ordered by unicode value), starting at 1. In other words, 
>> for a given field, all values are ordered lexicographically; this function 
>> then returns the offset of a particular value in that ordering. The field 
>> must have a maximum of one value per document (not multiValued).  0 is 
>> returned for documents without a value in the field.
>> +
>> -    Example: If there were only three values for a particular field: 
>> "apple","banana","pear", then ord("apple")=1, ord("banana")=2, ord("pear")=3
>> +  . Example: If there were only three values for a particular field: 
>> "apple","banana","pear", then ord("apple")=1, ord("banana")=2, ord("pear")=3
>> -
>> -    Example Syntax: '''ord(myIndexedField)'''
>> +  Example Syntax: '''ord(myIndexedField)'''
>> -
>> -    Example SolrQuerySyntax: '''_val_:"ord(myIndexedField)"'''
>> +  Example SolrQuerySyntax: '''_val_:"ord(myIndexedField)"'''
>> 
>> + WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use 
>> since they must use a FieldCache entry at the top level reader, while 
>> sorting and function queries now use entries at the segment level.  Hence 
>> sorting or using a different function query, in addition to ord()/rord() 
>> will double memory use.
>> - WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use 
>> since they must use a FieldCache entry
>> - at the top level reader, while sorting and function queries now use 
>> entries at the segment level.  Hence sorting
>> - or using a different function query, in addition to ord()/rord() will 
>> double memory use.
>> -
>> 
>>  WARNING: ord() depends on the position in an index and can thus change when 
>> other documents are inserted or deleted, or if a !MultiSearcher is used.
>> 
>>  == rord ==
>>  The reverse ordering of what ord provides.
>> +
>> -     Example Syntax: '''rord(myIndexedField)'''
>> +  . Example Syntax: '''rord(myIndexedField)'''
>> -
>> -     Example: '''rord(myDateField)''' is a metric for how old a document 
>> is: the youngest document will return 1, the oldest document will return the 
>> total number of documents.
>> +  Example: '''rord(myDateField)''' is a metric for how old a document is: 
>> the youngest document will return 1, the oldest document will return the 
>> total number of documents.
>> 
>> + WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use 
>> since they must use a FieldCache entry at the top level reader, while 
>> sorting and function queries now use entries at the segment level.  Hence 
>> sorting or using a different function query, in addition to ord()/rord() 
>> will double memory use.
>> -
>> - WARNING: as of Solr 1.4, ord() and rord() can cause excess memory use 
>> since they must use a FieldCache entry
>> - at the top level reader, while sorting and function queries now use 
>> entries at the segment level.  Hence sorting
>> - or using a different function query, in addition to ord()/rord() will 
>> double memory use.
>> 
>>  == sum ==
>> - <!> [[Solr1.3]]
>> - sum(x,y,...) returns the sum of multiple functions.
>> + <!> [[Solr1.3]] sum(x,y,...) returns the sum of multiple functions.
>> +
>> -     Example Syntax: '''sum(x,1)'''
>> +  . Example Syntax: '''sum(x,1)'''
>> -
>> -     Example Syntax: '''sum(x,y)'''
>> +  Example Syntax: '''sum(x,y)'''
>> -
>> -     Example Syntax: '''sum(sqrt(x),log(y),z,0.5)'''
>> +  Example Syntax: '''sum(sqrt(x),log(y),z,0.5)'''
>> 
>>  == sub ==
>> - <!> [[Solr1.4]]
>> - sub(x,y) returns x-y
>> + <!> [[Solr1.4]] sub(x,y) returns x-y
>> +
>> -     Example: '''sub(myfield,myfield2)'''
>> +  . Example: '''sub(myfield,myfield2)'''
>> -
>> -     Example: '''sub(100,sqrt(myfield))'''
>> +  Example: '''sub(100,sqrt(myfield))'''
>> 
>>  == product ==
>> - <!> [[Solr1.3]]
>> - product(x,y,...) returns the product of multiple functions.
>> + <!> [[Solr1.3]] product(x,y,...) returns the product of multiple functions.
>> +
>> -     Example Syntax: '''product(x,2)'''
>> +  . Example Syntax: '''product(x,2)'''
>> -
>> -     Example Syntax: '''product(x,y)'''
>> +  Example Syntax: '''product(x,y)'''
>> 
>>  == div ==
>> - <!> [[Solr1.3]]
>> - div(x,y) divides the function x by the function y.
>> + <!> [[Solr1.3]] div(x,y) divides the function x by the function y.
>> +
>> -     Example Syntax: '''div(1,x)'''
>> +  . Example Syntax: '''div(1,x)'''
>> -
>> -     Example Syntax: '''div(sum(x,100),max(y,1))'''
>> +  Example Syntax: '''div(sum(x,100),max(y,1))'''
>> 
>>  == pow ==
>> - <!> [[Solr1.3]]
>> - pow(x,y) raises the base x to the power y.
>> + <!> [[Solr1.3]] pow(x,y) raises the base x to the power y.
>> +
>> -     Example Syntax: '''pow(x,0.5)'''   same as sqrt
>> +  . Example Syntax: '''pow(x,0.5)'''   same as sqrt
>> -
>> -     Example Syntax: '''pow(x,log(y))'''
>> +  Example Syntax: '''pow(x,log(y))'''
>> 
>>  == abs ==
>> - <!> [[Solr1.3]]
>> - abs(x) returns the absolute value of a function.
>> + <!> [[Solr1.3]] abs(x) returns the absolute value of a function.
>> +
>> -     Example Syntax: '''abs(-5)'''
>> +  . Example Syntax: '''abs(-5)'''
>> -
>> -     Example Syntax: '''abs(x)'''
>> +  Example Syntax: '''abs(x)'''
>> 
>>  == log ==
>> - <!> [[Solr1.3]]
>> - log(x) returns log base 10 of the function x.
>> + <!> [[Solr1.3]] log(x) returns log base 10 of the function x.
>> +
>> -     Example Syntax: '''log(x)'''
>> +  . Example Syntax: '''log(x)'''
>> -
>> -     Example Syntax: '''log(sum(x,100))'''
>> +  Example Syntax: '''log(sum(x,100))'''
>> 
>>  == sqrt ==
>> - <!> [[Solr1.3]]
>> - sqrt(x) returns the square root of the function x
>> + <!> [[Solr1.3]] sqrt(x) returns the square root of the function x
>> +
>> -     Example Syntax: '''sqrt(2)'''
>> +  . Example Syntax: '''sqrt(2)'''
>> -
>> -     Example Syntax: '''sqrt(sum(x,100))'''
>> +  Example Syntax: '''sqrt(sum(x,100))'''
>> 
>>  == map ==
>> - <!> [[Solr1.3]]
>> - map(x,min,max,target) maps any values of the function x that fall within 
>> min and max inclusive to target.  min,max,target are constants. It outputs 
>> the field's value if it does not fall between min and max.
>> + <!> [[Solr1.3]] map(x,min,max,target) maps any values of the function x 
>> that fall within min and max inclusive to target.  min,max,target are 
>> constants. It outputs the field's value if it does not fall between min and 
>> max.
>> +
>> -     Example Syntax 1: '''map(x,0,0,1)'''  change any values of 0 to 1... 
>> useful in handling default 0 values
>> +  . Example Syntax 1: '''map(x,0,0,1)'''  change any values of 0 to 1... 
>> useful in handling default 0 values
>> -
>> -     Example Syntax 2 <!> [[Solr1.4]]: '''map(x,0,0,1,0)'''  change any 
>> values of 0 to 1 . and if the value is not zero it can be set to the value 
>> of the 5th argument instead of defaulting to the field's value
>> +  Example Syntax 2 <!> [[Solr1.4]]: '''map(x,0,0,1,0)'''  change any values 
>> of 0 to 1 . and if the value is not zero it can be set to the value of the 
>> 5th argument instead of defaulting to the field's value
>> -
>> -
>> -
>> 
>>  == scale ==
>> - <!> [[Solr1.3]]
>> - scale(x,minTarget,maxTarget) scales values of the function x such that 
>> they fall between minTarget and maxTarget inclusive.
>> + <!> [[Solr1.3]] scale(x,minTarget,maxTarget) scales values of the function 
>> x such that they fall between minTarget and maxTarget inclusive.
>> -     Example Syntax: '''scale(x,1,2)'''  all values will be between 1 and 2 
>> inclusive.
>> 
>> -     NOTE: The current implementation currently traverses all of the 
>> function values to obtain the min and max so it can pick the correct scale.
>> +  . Example Syntax: '''scale(x,1,2)'''  all values will be between 1 and 2 
>> inclusive. NOTE: The current implementation currently traverses all of the 
>> function values to obtain the min and max so it can pick the correct scale.
>> -
>> -     NOTE: This implementation currently cannot distinguish when documents 
>> have been deleted or documents that have no value, and 0.0 values will be 
>> used for these cases.  This means that if values are normally all greater 
>> than 0.0, one can still end up with 0.0 as the min value to map from.  In 
>> these cases, an appropriate map() function could be used as a workaround to 
>> change 0.0 to a value in the real range.  example: 
>> '''scale(map(x,0,0,5),1,2)'''
>> +  NOTE: This implementation currently cannot distinguish when documents 
>> have been deleted or documents that have no value, and 0.0 values will be 
>> used for these cases.  This means that if values are normally all greater 
>> than 0.0, one can still end up with 0.0 as the min value to map from.  In 
>> these cases, an appropriate map() function could be used as a workaround to 
>> change 0.0 to a value in the real range.  example: 
>> '''scale(map(x,0,0,5),1,2)'''
>> 
>>  == query ==
>> - <!> [[Solr1.4]]
>> - query(subquery, default) returns the score for the given subquery, or the 
>> default value for documents not matching the query.  Any type of subquery is 
>> supported through either parameter dereferencing {{{$otherparam}}} or direct 
>> specification of the query string in the LocalParams via "v".
>> + <!> [[Solr1.4]] query(subquery, default) returns the score for the given 
>> subquery, or the default value for documents not matching the query.  Any 
>> type of subquery is supported through either parameter dereferencing 
>> {{{$otherparam}}} or direct specification of the query string in the 
>> LocalParams via "v".
>> 
>> -     Example Syntax: '''q=product(popularity, query({!dismax v='solr 
>> rocks'})''' returns the product of the popularity and the score of the 
>> dismax query.
>> +  . Example Syntax: '''q=product(popularity, query({!dismax v='solr 
>> rocks'})''' returns the product of the popularity and the score of the 
>> dismax query.
>> -
>> -     Example Syntax: '''q=product(popularity, query($qq))&qq={!dismax}solr 
>> rocks''' is equivalent to the previous query, using param dereferencing.
>> +  Example Syntax: '''q=product(popularity, query($qq))&qq={!dismax}solr 
>> rocks''' is equivalent to the previous query, using param dereferencing.
>> -
>> -     Example Syntax: '''q=product(popularity, 
>> query($qq,0.1))&qq={!dismax}solr rocks''' specifies a default score of 0.1 
>> for documents that don't match the dismax query.
>> +  Example Syntax: '''q=product(popularity, query($qq,0.1))&qq={!dismax}solr 
>> rocks''' specifies a default score of 0.1 for documents that don't match the 
>> dismax query.
>> 
>>  == linear ==
>>  linear(x,m,c) implements m*x+c where m and c are constants and x is an 
>> arbitrary function.  This is equivalent to '''sum(product(m,x),c)''', but 
>> slightly more efficient as it is implemented as a single function.
>> +
>> -     Example Syntax: '''linear(x,2,4)'''  returns 2*x+4
>> +  . Example Syntax: '''linear(x,2,4)'''  returns 2*x+4
>> 
>>  == recip ==
>>  A reciprocal function with '''recip(x,m,a,b)''' implementing a/(m*x+b).  
>> m,a,b are constants, x is any numeric field or arbitrarily complex function.
>> 
>>  When a and b are equal, and x>=0, this function has a maximum value of 1 
>> that drops as x increases. Increasing the value of a and b together results 
>> in a movement of the entire function to a flatter part of the curve. These 
>> properties can make this an ideal function for boosting more recent 
>> documents when x is rord(datefield).
>> +
>> -     Example Syntax: '''recip(rord(creationDate),1,1000,1000)'''
>> +  . Example Syntax: '''recip(rord(creationDate),1,1000,1000)'''
>> 
>> - <!> [[Solr1.4]]
>> - In Solr 1.4 and later, best practice is to avoid ord() and rord() and 
>> derive the boost directly from the value of the date field.
>> + <!> [[Solr1.4]] In Solr 1.4 and later, best practice is to avoid ord() and 
>> rord() and derive the boost directly from the value of the date field. See 
>> ms() for more details.
>> - See ms() for more details.
>> 
>>  == max ==
>>  max(x,c) returns the max of another function and a constant.  Useful for 
>> "bottoming out" another function at some constant.
>> +
>> -     Example Syntax: '''max(myfield,0)'''
>> +  . Example Syntax: '''max(myfield,0)'''
>> 
>>  == ms ==
>>  <!> [[Solr1.4]]
>> @@ -175, +149 @@
>> 
>>  Arguments may be numerically indexed date fields such as !TrieDate (the 
>> default in 1.4), or date math (examples in SolrQuerySyntax) based on a 
>> constant date or '''NOW'''.
>> 
>>  '''ms()'''
>> +
>> -   Equivalent to '''ms(NOW)''', number of milliseconds since the epoch.
>> +  . Equivalent to '''ms(NOW)''', number of milliseconds since the epoch.
>> +
>>  '''ms(a)'''
>> +
>> -   Returns the number of milliseconds since the epoch that the argument 
>> represents.
>> +  . Returns the number of milliseconds since the epoch that the argument 
>> represents.
>> -
>> -   Example: '''ms(NOW/DAY)'''
>> +  Example: '''ms(NOW/DAY)'''
>> -
>> -   Example: '''ms(2000-01-01T00:00:00Z)'''
>> +  Example: '''ms(2000-01-01T00:00:00Z)'''
>> -
>> -   Example: '''ms(mydatefield)'''
>> +  Example: '''ms(mydatefield)'''
>> +
>>  '''ms(a,b)'''
>> +
>> -   Returns the number of milliseconds that {{{b}}} occurs before {{{a}}} 
>> (i.e. {{{a - b}}}).  Note that this offers higher precision than 
>> '''sub(a,b)''' because the arguments are not converted to floating point 
>> numbers before subtraction.
>> +  . Returns the number of milliseconds that {{{b}}} occurs before {{{a}}} 
>> (i.e. {{{a - b}}}).  Note that this offers higher precision than 
>> '''sub(a,b)''' because the arguments are not converted to floating point 
>> numbers before subtraction.
>> -
>> -   Example: '''ms(NOW,mydatefield)'''
>> +  Example: '''ms(NOW,mydatefield)'''
>> -
>> -   Example: '''ms(mydatefield,2000-01-01T00:00:00Z)'''
>> +  Example: '''ms(mydatefield,2000-01-01T00:00:00Z)'''
>> -
>> -   Example: '''ms(datefield1,datefield2)'''
>> +  Example: '''ms(datefield1,datefield2)'''
>> +
>> + == dist ==
>> + [[Solr1.5]]
>> +
>> + Return the Distance between two Vectors (points) in an n-dimensional 
>> space.  See http://en.wikipedia.org/wiki/Lp_space for more information.  
>> Takes in the power, plus two or more !ValueSource instances and calculates 
>> the distances between the two vectors.  Each !ValueSource must be a number.
>> +
>> + Common cases:
>> +
>> +  ||<tablestyle="width: 467px; height: 88px;">Power ||Common Name ||
>> +  ||0 ||Sparseness calculation ||
>> +  ||1||Manhattan (taxicab) Distance||
>> +  ||2||Euclidean Distance||
>> +  ||Infinite||Infinite norm - maximum value in the vector||
>> +
>> +
>> 
>>  === Date Boosting ===
>>  Boosting more recent content is a common use case.  One way is to use a 
>> {{{recip}}} function in conjunction with {{{ms}}}.
>> @@ -203, +191 @@
>> 
>>  Also see 
>> http://wiki.apache.org/solr/SolrRelevancyFAQ#How_can_I_boost_the_score_of_newer_documents
>> 
>>  == top ==
>> - <!> [[Solr1.4]]
>> - Causes it's function query argument to derive it's values from the 
>> top-level IndexReader containing all parts of an index.  For example, the 
>> ordinal of a value in a single segment will be different from the ordinal of 
>> that same value in the complete index.  The ord() and rord() functions 
>> implicitly use top() and hence ord(foo) is equivalent to top(ord(foo)).
>> + <!> [[Solr1.4]] Causes it's function query argument to derive it's values 
>> from the top-level IndexReader containing all parts of an index.  For 
>> example, the ordinal of a value in a single segment will be different from 
>> the ordinal of that same value in the complete index.  The ord() and rord() 
>> functions implicitly use top() and hence ord(foo) is equivalent to 
>> top(ord(foo)).
>> 
>>  = General Example =
>> -
>> - To give more idea about the use of the function query, suppose index 
>> stores dimensions in meters '''x''', '''y''','''z''' of some hypothetical 
>> boxes with arbitrary names stored in field '''boxname'''.
>> + To give more idea about the use of the function query, suppose index 
>> stores dimensions in meters '''x''', '''y''','''z''' of some hypothetical 
>> boxes with arbitrary names stored in field '''boxname'''. Suppose we want to 
>> search for box matching name ''findbox'' but ranked according to volumes of 
>> boxes, the query params would be:
>> - Suppose we want to search for box matching name ''findbox'' but ranked 
>> according to volumes of boxes, the query params would be:
>> +
>>  {{{
>>    q=boxname:findbox+_val_:"product(product(x,y),z)"
>>  }}}
>> -
>>  Although this will rank the results based on volumes but in order to get 
>> the computed volume you will need to add parameter...
>> +
>>  {{{
>>    &fl=*,score
>>  }}}
>> -
>>  ...where '''score''' will contain the resultant volume.
>> 
>>  Suppose you also have a field containing weight of the box as 'weight', 
>> then to sort by the density of the box and return the value of the density 
>> in score you query should be...
>> @@ -226, +211 @@
>> 
>>  {{{
>>  
>> http://localhost:8983/solr/select/?q=boxname:findbox+_val_:"div(weight,product(product(x,y),z))"&fl=boxname,x,y,z,weight,score
>>  }}}
>> -
>> 
>> 

--------------------------
Grant Ingersoll
http://www.lucidimagination.com/

Search the Lucene ecosystem (Lucene/Solr/Nutch/Mahout/Tika/Droids) using 
Solr/Lucene:
http://www.lucidimagination.com/search

Reply via email to